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 返回布尔值Is()条件判断方法代码
May 14 Javascript
如何使用jquery动态加载js,css文件实现代码
Apr 03 Javascript
详解JavaScript的表达式与运算符
Nov 30 Javascript
理解AngularJs指令
Dec 10 Javascript
Bootstrap表单Form全面解析
Jun 13 Javascript
JavaScript函数节流概念与用法实例详解
Jun 20 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
Jun 21 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
Apr 02 Javascript
如何获取vue单文件自身源码路径
May 06 Javascript
javascript实现导航栏分页效果
Jun 27 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
Jun 02 Javascript
Vue实现input宽度随文字长度自适应操作
Jul 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
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
python实现将元祖转换成数组的方法
2015/05/04 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
Python 占位符的使用方法详解
2019/07/10 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
python 通过exifread读取照片信息
2020/12/24 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
小学班级口号大全
2015/12/25 职场文书