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 相关文章推荐
动态加载js文件 document.createElement
Oct 14 Javascript
Extjs中ComboBox加载并赋初值的实现方法
Mar 22 Javascript
js调试工具console.log()方法查看js代码的执行情况
Aug 08 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
实例解析Array和String方法
Dec 14 Javascript
详解vue + vuex + directives实现权限按钮的思路
Oct 24 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
实现elementUI表单的全局验证的方法步骤
Apr 29 Javascript
关于vue-cli3打包代码后白屏的解决方案
Sep 02 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 Javascript
Javascript表单序列化原理及实现代码详解
Oct 30 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 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 simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
PHP安全性漫谈
2012/06/28 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
javascript 节点排序 2
2011/01/31 Javascript
javascript实用方法总结
2015/02/06 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
浅析Vue实例以及生命周期
2018/08/14 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
JavaScript在web自动化测试中的作用示例详解
2019/08/25 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
Python 初始化多维数组代码
2008/09/06 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
Python实现Linux中的du命令
2017/06/12 Python
Python 打印中文字符的三种方法
2018/08/14 Python
python实现名片管理系统
2018/11/29 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
python正则表达式实例代码
2020/03/03 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
学校党风廉政建设调研报告
2015/01/01 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
Python网络编程之ZeroMQ知识总结
2021/04/25 Python