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 相关文章推荐
json 定义
Jun 10 Javascript
javascript 单选框,多选框美化代码
Aug 01 Javascript
锋利的jQuery 第三章章节总结的例子
Mar 23 Javascript
jquery星级插件、支持页面中多次使用
Mar 25 Javascript
基于javascipt-dom编程 table对象的使用
Apr 22 Javascript
JavaScript 垃圾回收机制分析
Oct 10 Javascript
探讨js字符串数组拼接的性能问题
Oct 11 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
Mar 04 Javascript
JavaScript使用Replace进行字符串替换的方法
Apr 14 Javascript
Node.js中流(stream)的使用方法示例
Jul 16 Javascript
解决微信二次分享不显示摘要和图片的问题
Aug 18 Javascript
纯js实现隔行变色效果
Nov 29 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
用文本文件制作留言板提示(下)
2006/10/09 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
php实现的二分查找算法示例
2017/06/20 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
ASP Json Parser修正版
2009/12/06 Javascript
使用jQuery.fn自定义jQuery翻页插件
2013/01/20 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
js关于命名空间的函数实例
2015/02/05 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
学习node.js 断言的使用详解
2019/03/18 Javascript
微信小程序template模板与component组件的区别和使用详解
2019/05/22 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
使用tensorflow实现AlexNet
2017/11/20 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
全球性的在线购物网站:Zapals
2017/03/22 全球购物
自我评价中英文语句
2013/11/30 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
小学记事作文之200字
2019/08/06 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
HttpClient实现表单提交上传文件
2022/08/14 Java/Android