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 相关文章推荐
js调用图片隐藏&amp;显示实现代码
Sep 13 Javascript
再JavaScript的jQuery库中编写动画效果的指南
Aug 13 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
Sep 26 Javascript
Javascript类型转换的规则实例解析
Feb 23 Javascript
深入浅析JavaScript中的scrollTop
Jul 11 Javascript
Vue结合原生js实现自定义组件自动生成示例
Jan 21 Javascript
JavaScript实现简单的星星评分效果
May 18 Javascript
vue页面使用阿里oss上传功能的实例(二)
Aug 09 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
Sep 20 Javascript
vue2.0使用swiper组件实现轮播效果
Nov 27 Javascript
Vue加载json文件的方法简单示例
Jan 28 Javascript
Javascript通过控制类名更改样式
May 24 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多用户计数器代码
2007/03/11 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
php上传excel表格并获取数据
2017/04/27 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
[27:39]Ti4 循环赛第二日 LGD vs Fnatic
2014/07/11 DOTA
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
Python中Threading用法详解
2017/12/27 Python
python计算两个地址之间的距离方法
2018/06/09 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
浅谈django channels 路由误导
2020/05/28 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
公司活动策划方案
2014/01/13 职场文书
会议开场欢迎词
2014/01/15 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
会计工作岗位职责
2015/02/03 职场文书
python缺失值的解决方法总结
2021/06/09 Python