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 相关文章推荐
破除一些网站复制、右键限制
Nov 04 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
Jul 27 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
Aug 31 Javascript
javascript 继承学习心得总结
Mar 17 Javascript
jQuery实现图片向左向右切换效果的简单实例
May 18 Javascript
深入理解js数组的sort排序
May 28 Javascript
javascript小数精度丢失的完美解决方法
May 31 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
RequireJS 依赖关系的实例(推荐)
Jan 21 Javascript
详解vue-cli构建项目反向代理配置
Sep 07 Javascript
浅谈JavaScript闭包
Apr 09 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
Jul 18 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 图片加水印与上传图片加水印php类
2010/05/12 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
js动态创建、删除表格示例代码
2013/08/07 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
python之super的使用小结
2018/08/13 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
python 制作磁力搜索工具
2021/03/04 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
ORACLE十问
2015/04/20 面试题
总监职责范文
2013/11/09 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
社区母亲节活动记录
2014/03/06 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
党员心得体会范文2016
2016/01/23 职场文书
导游词幽默开场白
2019/06/26 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python