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 相关文章推荐
找到一点可怜的关于dojo资料,谢谢作者!
Dec 06 Javascript
javascript 通用简单的table选项卡实现
May 07 Javascript
JavaScript单元测试ABC
Apr 12 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
Apr 12 Javascript
js函数与php函数的区别实例浅析
Jan 12 Javascript
动态的9*9乘法表效果的实现代码
May 16 Javascript
AngularJS 执行流程详细介绍
Aug 18 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
30分钟快速入门掌握ES6/ES2015的核心内容(上)
Apr 18 Javascript
浅谈React的最大亮点之虚拟DOM
May 29 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
Oct 17 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
May 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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
用PHP编程语言开发动态WAP页面
2006/10/09 PHP
PHP:风雨欲来 路在何方?
2006/10/09 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
jquery 简单的进度条实现代码
2010/03/11 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
JavaScript运算符小结
2015/06/03 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
理解 JavaScript EventEmitter
2018/03/29 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
Python3中多线程编程的队列运作示例
2015/04/16 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
python使用配置文件过程详解
2019/12/28 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
大学生活自我评价
2014/04/09 职场文书
电气自动化求职信
2014/06/24 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL