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 相关文章推荐
让innerText在firefox火狐和IE浏览器都能用的写法
May 14 Javascript
使用Browserify配合jQuery进行编程的超级指南
Jul 28 Javascript
javascript闭包(Closure)用法实例简析
Nov 30 Javascript
理解javascript中DOM事件
Dec 25 Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 Javascript
js添加事件的通用方法推荐
May 15 Javascript
Angular2入门--架构总览
Mar 29 Javascript
bootstrap Table插件使用demo
Aug 07 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
vue中倒计时组件的实例代码
Jul 06 Javascript
详解vuex 渐进式教程实例代码
Nov 27 Javascript
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
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.MVC的模板标签系统(五)
2006/09/05 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
javascript中的array数组使用技巧
2010/01/31 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
javascript实现动态标签云
2015/10/16 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
浅析$(function) ready和onload 的区别
2016/09/03 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
使用Python抓取模板之家的CSS模板
2015/03/16 Python
Python中的urllib模块使用详解
2015/07/07 Python
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
法学毕业生自我鉴定
2013/11/08 职场文书
初中音乐教学反思
2014/01/12 职场文书
布达拉宫的导游词
2015/02/02 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
大学毕业晚会开场白
2015/05/29 职场文书