Vue 基于 vuedraggable 实现选中、拖拽、排序效果


Posted in Javascript onMay 18, 2020

今天有个朋友说要做个效果:Vue实现拖拽排序,要有 checked,输出结果是排序后的,要全选,未选中的不能拖动。

其实我之前基于 Sortable 做过一个类似的效果。也给他看过了,没看太明白,他就自己基于 vuedraggable 实现了一下。

正好有点问题给他解决了一下。废话不多说,先上最终效果:Vue 拖拽排序效果 测试地址。下面就是最终效果图。

Vue 基于 vuedraggable 实现选中、拖拽、排序效果

效果一:实现选中 和 全选效果

就下面这样,elementUI 官方 Demo。很简单毫无挑战呀。

<el-checkbox
 :indeterminate="isIndeterminate"
 v-model="checkAll"
 @change="handleCheckAllChange"
 >全部</el-checkbox
>
<el-checkbox-group
 v-model="checkedCities"
 @change="handleCheckedCitiesChange"
>
 <el-checkbox :class="{'item': checkedCities.find(v=>v==city)}" v-for="city in cities" :label="city" :key="city">{{ city }}</el-checkbox>
</el-checkbox-group>

效果二:实现拖拽效果

拖拽效果基于 vuedraggable 实现。

问题

这里我凭借我的资深经(踩)验(坑),先提出几个可能存在的问题。

  • <el-checkbox-group v-model="checkedCities"> 实现的效果只是记录选中的项,无排序
  • vue 和 jQuery 做起来最大的区别是什么?基于如下描述,会出现视图显示和数据对不上。

vue 通过数据驱动视图,也可以理解为数据改变,视图自动改变。

jQuery 通过改变直接视图先反馈数据。

基于上面两点,就可以看到基本上操作 DOM 的库,Vue 在使用的时候都有问题。

因为他们只操作了 DOM,而 Vue 需要是的你修改数据。

解决方案 & 代码

<el-checkbox-group v-model="checkedCities"> 的问题比较好解决。我们在数据的时候根据数据源排序一把就 ok。

因为问题是库只修改 DOM,未修改数据,那么我们可以考虑监听他的回调事件,然后手动的去修改数据(Sortable 我就这样做的)。
Vue.Draggable 的封装还是有点东西的,他提供了 :list="cities" 让你传入数据源,然后操作的时候替你修改数据。

<el-checkbox
 :indeterminate="isIndeterminate"
 v-model="checkAll"
 @change="handleCheckAllChange"
>全部</el-checkbox>
<el-checkbox-group
 v-model="checkedCities"
 @change="handleCheckedCitiesChange">
 <draggable draggable=".item" :list="cities">
 <el-checkbox :class="{'item': checkedCities.find(v=>v==city)}" v-for="city in cities" :label="city" :key="city">{{ city }}</el-checkbox>
 </draggable>
</el-checkbox-group>

效果三:只有选中的才能拖拽

上面我们已经实现了拖拽。但是未选中也能拖拽排序就感觉怪怪的。
这里有两个做法

  • 我是记得有提供这样的功能,找了找文档果然有 draggable=".item" ,指定可拖拽元素的 class。
  • 但是它这个效果很诡异,未选中的的确不能拖动了,但是你也不能拖动已选中的占据他的位置。
  • 所以我又加了个处理。我对数据源做了排序,这样选中和未选中就分堆了。
  • 接下来说第二种方案。那就是在他提供的钩子函数上去自己判断当前 DOM 该不该执行拖拽。

Vue 的库在使用中要注意操作元数据,而不是只修改 DOM。

ps:下面在看下vue + vuedraggable 实现拖拽排序

安装

npm install vuedraggable

引入

import draggable from 'vuedraggable'

注册

components: {
 draggable
}

html

<draggable
 class="list"
 v-model="modules"
 :clone="clone"
 :options="{
 group: {
  name: 'layout',
  pull: 'clone',
  put: false
 },
 draggable: '.item',
 forceFallback: true,
 sort: false,
 animation: 50
 }">
 <transition-group tag="ul">
 <li
  v-for="(item, index) in modules"
  :key="index"
  class="item">
  <div class="holder">
  <img :src="item.icon" />
  <h3>{{item.text}}</h3>
  </div>
 </li>
 </transition-group>
</draggable>

相关文档

官方地址:https://sortablejs.github.io/Vue.Draggable/#/simple

Github:https://github.com/SortableJS/Vue.Draggable

Demo:https://david-desmaisons.github.io/draggable-example/

到此这篇关于Vue 基于 vuedraggable 实现选中、拖拽、排序效果的文章就介绍到这了,更多相关vue vuedraggable实现选中、拖拽、排序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Javascript 读后台cookie代码
Sep 15 Javascript
event对象的方法 兼容多浏览器
Jun 27 Javascript
jquery超简单实现手风琴效果的方法
Jun 05 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
JavaScript简单获取系统当前时间完整示例
Aug 02 Javascript
AngularJs  Using $location详解及示例代码
Sep 02 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
Aug 02 Javascript
web页面和微信小程序页面实现瀑布流效果
Sep 26 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
Oct 08 Javascript
node.js爬取中关村的在线电瓶车信息
Nov 13 Javascript
Vue.js 中的 v-show 指令及用法详解
Nov 19 Javascript
JavaScript使用Math.random()生成简单的验证码
Jan 21 Javascript
react 生命周期实例分析
May 18 #Javascript
react使用CSS实现react动画功能示例
May 18 #Javascript
Node.js API详解之 net模块实例分析
May 18 #Javascript
Javascript实现简易天数计算器
May 18 #Javascript
微信小程序开发打开另一个小程序的实现方法
May 17 #Javascript
微信小程序开发之获取用户手机号码(php接口解密)
May 17 #Javascript
关于AngularJS中几种Providers的区别总结
May 17 #Javascript
You might like
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
php+mysql实现无限分类实例详解
2015/01/15 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
分享vue里swiper的一些坑
2018/08/30 Javascript
vue slots 组件的组合/分发实例
2018/09/06 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
对Django中内置的User模型实例详解
2019/08/16 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
巴西本土电商平台:Americanas
2020/06/21 全球购物
建龙钢铁面试总结
2014/04/15 面试题
生产车间主任的个人自我鉴定
2013/10/25 职场文书
新闻编辑自荐信
2013/11/03 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
公司转让协议书
2016/03/19 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
python中如何对多变量连续赋值
2021/06/03 Python