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 相关文章推荐
神奇的7个jQuery 3D插件整理
Jan 06 Javascript
js 利用image对象实现图片的预加载提高访问速度
Mar 29 Javascript
ExtJS实现文件下载的方法实例
Nov 09 Javascript
js面向对象之公有、私有、静态属性和方法详解
Apr 17 Javascript
javascript实现淘宝幻灯片广告展示效果
Apr 27 Javascript
基于canvas的二维码邀请函生成插件
Feb 14 Javascript
js canvas实现擦除效果示例代码
Apr 26 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
Jul 27 Javascript
如何从零开始利用js手写一个Promise库详解
Apr 19 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
May 02 Javascript
Vue基础学习之项目整合及优化
Jun 02 Javascript
浅谈JS中几种轻松处理'this'指向方式
Sep 16 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实现获取及设置用户访问页面语言类
2014/09/24 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
jQuery Mobile页面返回不需要重新get
2016/04/26 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
采用python实现简单QQ单用户机器人的方法
2014/07/03 Python
python中readline判断文件读取结束的方法
2014/11/08 Python
判断网页编码的方法python版
2016/08/12 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
tensorflow实现图像的裁剪和填充方法
2018/07/27 Python
Python中的类与类型示例详解
2019/07/10 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
荷兰电脑专场:Paradigit
2018/05/05 全球购物
总监职责范文
2013/11/09 职场文书
高三英语教学反思
2014/01/13 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
英文升职感谢信
2015/01/23 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
初中毕业生感言
2015/07/31 职场文书
Python基础之元编程知识总结
2021/05/23 Python
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
24年收藏2000多部退役军用电台
2022/02/18 无线电