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 相关文章推荐
firefox中JS读取XML文件
Dec 21 Javascript
JavaScript的原型继承详解
Feb 15 Javascript
详解JavaScript的Date对象(制作简易钟表)
Apr 07 Javascript
Node.js 条形码识别程序构建思路详解
Feb 14 Javascript
初识angular框架后的所思所想
Feb 19 Javascript
vue-resource 拦截器使用详解
Feb 21 Javascript
微信小程序左右滑动切换页面详解及实例代码
Feb 28 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
全新打包工具parcel零配置vue开发脚手架
Jan 11 Javascript
在vscode中统一vue编码风格的方法
Feb 22 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 Javascript
Angular6使用forRoot() 注册单一实例服务问题
Aug 27 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生成shtml类用法实例
2014/12/09 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
document.createElement()用法
2013/03/13 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
python中的二维列表实例详解
2018/06/19 Python
Python实现最常见加密方式详解
2019/07/13 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
Python读取xlsx数据生成图标代码实例
2020/08/12 Python
python数据抓取3种方法总结
2021/02/07 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
预备党员表决心书
2014/03/11 职场文书
高校教师自荐信范文
2014/03/13 职场文书
乳制品整治工作方案
2014/05/29 职场文书
长征观后感
2015/06/09 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
Python如何把不同类型数据的json序列化
2021/04/30 Python
写好Python代码的几条重要技巧
2021/05/21 Python
ant design charts 获取后端接口数据展示
2022/05/25 Javascript