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 相关文章推荐
判断JavaScript对象是否可用的最正确方法分析
Oct 03 Javascript
checkbox 多选框 联动实现代码
Oct 22 Javascript
Jquery 实现Tab效果 思路是js思路
Mar 02 Javascript
JavaScript 面向对象之命名空间
May 04 Javascript
jquery调取json数据实现省市级联的方法
Jan 29 Javascript
触屏中的JavaScript事件分析
Feb 06 Javascript
jquery实现页面虚拟键盘特效
Aug 08 Javascript
解析利用javascript如何判断一个数为素数
Dec 08 Javascript
详解JavaScript对象的深浅复制
Mar 30 Javascript
纯js代码生成可搜索选择下拉列表的实例
Jan 11 Javascript
Vue多种方法实现表头和首列固定的示例代码
Feb 02 Javascript
vue ajax 拦截原理与实现方法示例
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
php 什么是PEAR?
2009/03/19 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
Python遍历numpy数组的实例
2018/04/04 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
介绍一下游标
2012/01/10 面试题
酷瑞网络科技面试题
2012/03/30 面试题
J2EE面试题大全
2016/08/06 面试题
企业管理培训感言
2014/01/27 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
就业意向书
2014/07/29 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
创业计划书之校园超市
2019/09/12 职场文书
python 实现定时任务的四种方式
2021/04/01 Python