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设置和获取HTML、文本和值示例
Jul 08 Javascript
jQuery插件制作的实例教程
May 16 Javascript
js拼接html字符串的注意事项
Oct 13 Javascript
深入理解jquery中extend的实现
Dec 22 Javascript
微信小程序 textarea 组件详解及简单实例
Jan 10 Javascript
JavaScript制作简单的框选图表
May 15 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
Aug 08 Javascript
微信小程序自定义音乐进度条的实例代码
Aug 28 Javascript
vue配置font-awesome5的方法步骤
Jan 27 Javascript
一个小时快速搭建微信小程序的方法步骤
Apr 15 Javascript
Vue拖拽组件列表实现动态页面配置功能
Jun 17 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中10个不常见却非常有用的函数
2010/03/21 PHP
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
jQuery之过滤元素操作小结
2013/11/30 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
javascript 实现动态侧边栏实例详解
2016/11/11 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
家居设计专业个人自荐信范文
2013/11/26 职场文书
安全检查与奖惩制度
2014/01/23 职场文书
致百米运动员广播稿
2014/01/29 职场文书
四年大学自我鉴定
2014/02/17 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
商业融资计划书
2014/04/29 职场文书
政协会议宣传标语
2014/10/09 职场文书
初级职称评定工作总结
2015/08/13 职场文书
护理工作心得体会
2016/01/22 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL