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单选框radio绑定click事件实现方法
Jan 14 Javascript
jquery仿百度百科底部浮动导航特效
Aug 08 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 Javascript
JavaScript实现上下浮动的窗口效果代码
Oct 12 Javascript
简单实现js页面切换功能
Jan 10 Javascript
浅谈js中的引用和复制(传值和传址)
Sep 18 Javascript
解决拦截器对ajax请求的拦截实例详解
Dec 21 Javascript
AngularJS执行流程详解
Feb 17 Javascript
JS简单实现自定义右键菜单实例
May 31 Javascript
浅谈函数调用的不同方式,以及this的指向
Sep 17 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 Javascript
利用JS响应式修改vue实现页面的input值
Sep 02 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处理json时中文问题的解决方法
2011/04/12 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
html中table数据排序的js代码
2011/08/09 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
js加强的经典分页实例
2013/03/15 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
原生js实现购物车功能
2020/09/23 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
人机交互程序 python实现人机对话
2017/11/14 Python
使用python3构建文件传输的方法
2019/02/13 Python
Django缓存系统实现过程解析
2019/08/02 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
2019/08/09 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
python Paramiko使用示例
2020/09/21 Python
实习护理工作自我评价
2013/09/25 职场文书
写景作文评语集锦
2014/12/25 职场文书
初中优秀学生评语
2014/12/29 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
php png失真的原因及解决办法
2021/10/24 PHP