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 相关文章推荐
Jquery Select操作方法集合脚本之家特别版
May 17 Javascript
转换json格式的日期为Javascript对象的函数
Jul 13 Javascript
13个绚丽的Jquery 界面设计网站推荐
Sep 28 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
javascript实现表单提交后,提交按钮不可用的方法
Apr 18 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
Nov 30 Javascript
js自制图片放大镜功能
Jan 24 Javascript
使用vue制作FullPage页面滚动效果
Aug 21 Javascript
javaScript日期工具类DateUtils详解
Dec 08 Javascript
说说Vue.js中的functional函数化组件的使用
Feb 12 Javascript
基于JS实现前端压缩上传图片的实例代码
May 14 Javascript
webpack中的模式(mode)使用详解
Feb 20 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
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
php多进程应用场景实例详解
2019/07/22 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python FTP操作类代码分享
2014/05/13 Python
python常规方法实现数组的全排列
2015/03/17 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
Flask-WTF表单的使用方法
2019/07/12 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
Python小白学习爬虫常用请求报头
2020/06/03 Python
python中添加模块导入路径的方法
2021/02/03 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
数控技术应届生求职信
2013/11/13 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
学校搬迁方案
2014/06/15 职场文书
初中教师个人工作总结
2015/02/10 职场文书
小学运动会入场词
2015/07/18 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS