您现在的位置是:网站首页> 编程资料编程资料
vue中实现拖拽排序功能的详细教程_vue.js_
2023-05-24
344人已围观
简介 vue中实现拖拽排序功能的详细教程_vue.js_
原生拖拽 API 实现拖拽
设置元素 dragable
将元素的 dragable 属性设置 为 true (文本 图片 链接 的draggable 属性默认为 true)则元素可拖放
拖拽
拖放事件
在拖放的过程中涉及到两种元素,一种是被拖拽元素(源对象),一种是放置区元素(目标对象),不同的对象有不同的拖放事件。
| 触发对象 | 事件名称 | 说明 |
|---|---|---|
| 源对象 | dragstart | 源对象开始被拖动时触发 |
| drag | 源对象被拖动过程中反复触发 | |
| dragend | 源对象拖动结束时触发 | |
| 目标对象 | dragenter | 源对象开始进入目标对象范围内触发 使用 pereventDefault 来阻止浏览器默认的拒绝拖拽 |
| dragover | 源对象在目标对象范围内移动时触发 使用 pereventDefault 来阻止浏览器默认的拒绝拖拽 | |
| dragleave | 源对象离开目标对象范围时触发 | |
| drop | 源对象在目标对象范围内被释放时触发 |
dragenter和dragover事件的默认行为是拒绝接受任何被拖放的元素。因此,我们要在这两个拖放事件中使用preventDefault来阻止浏览器的默认行为;而且目标对象想要变成可释放区域,必须设置dragover和drop事件处理程序属性。
拖拽排序
利用拖放API来实现列表的拖拽排序
- 由于拖动是实时的,所以没有使用drop而是使用了dragenter触发排序。
- 在源对象开始被拖拽时记录其索引dragIndex,当它进入目标对象时(对应dragenter事件),将其插入到目标对象的位置。
- 其中dragenter方法中有一个判断this.dragIndex !== index(index为当前目标对象的索引),这是因为源对象同时也是目标对象,当没有这个判断时,源对象开始被拖拽时就会立刻触发自身的dragenter事件,这是不合理的。
拖拽API + 防抖实现
{{item.label}}
vue awe-dnd 拖拽组件
安装 awe-dnd 组件库
yarn add awe-dnd -S
在 main.js 中将 awe 挂载到全局
// 引入拖拽排序插件 import VueDND from 'awe-dnd' Vue.use(VueDND)
实现案例
{{item.id +"--"+ item.name }}

v-dragging=“{ item: item, list: colors, group: ‘item’,otherData:‘whatever u want’, comb: ‘isComb’}”
list: 列表的遍历数据,
item: 是当前循环值 , 遍历后需要拖拽功能的元素
group: “unique key of dragable list”即拖拽列表的独特key值
// 拖拽事件 this.$dragging.$on("dragged", (result) => { debugger // console.log('result===>',result) // result 拖拽后的信息 将排序后console.log的结果重新赋值 this.list = result.value.list; }); 项目中-- 拖拽的效果 不理想
功能能够实现,但拖拽的效果不是很好,无法修改拖拽图层的透明度
vue-smooth-DnD
Vue Smooth DnD 是一个快速、轻量级的拖放、可排序的 Vue.js 库,封装了 smooth-dnd 库。
vue-smooth-DnD 文档 : https://github.com/kutlugsahin/vue-smooth-dnd
安装 smooth-dnd
yarn add vue-smooth-dnd -S
API: container
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| :orientation | string | vertical | 容器的方向,可以为 horizontal 或 vertical |
| :behaviour | string | move | 描述被拖动的元素被移动或复制到目标容器。 可以为 move (容器间相互移动) 或 copy(将元素复制到其他容器,但本容器内元素不变) 或 drop-zone(在容器间移动,但是容器内元素的顺序是固定的) 或 contain (只能在容器内移动。) |
| :tag | string, NodeDescription | div | 容器的元素标签,默认是 div ,可以是字符串如 tag=“table” 也可以是包含 value和 props 属性的对象 :tag=“{value: ‘table’, props: {class: ‘my-table’}}” |
| :group-name | string | undefined | 可拖动元素可以在具有相同组名的容器之间移动。如果未设置组名容器将不接受来自外部的元素。 这种行为可以被 shouldAcceptDrop 函数覆盖。 |
| :lock-axis | string | undefined | 锁定拖动的移动轴。可用值 x, y 或 undefined。 |
| :drag-handle-selector | string | undefined | 用于指定可以开启拖拽的 CSS 选择器,如果不指定的话则元素内部任意位置都可抓取。 例如 drag-handle-selector=“.column-drag-handle” |
| :non-drag-area-selector | string | undefined | 禁止拖动的 CSS 选择器,优先于 dragHandleSelector. |
| :drag-begin-delay | number | 0(触控设备为 200) | 单位毫秒。表示点击元素持续多久后可以开始拖动。在此之前移动光标超过 5px 将取消拖动。 |
| :animation-duration | number | 250 | 单位毫秒。表示放置元素和重新排序的动画持续时间。 |
| :auto-scroll-enabled | boolean | true | 如果拖动项目接近边界,第一个可滚动父项将自动滚动 |
| :drag-class | string | undefined | 元素被拖动中的添加的类(不会影响拖拽结束后元素的显示) |
| :drop-class | string | undefined | 从拖拽元素被放置到被添加到页面过程中添加的类。 |
| :remove-on-drop-out | boolean | undefined | 如果设置为 true,在被拖拽元素没有被放置到任何相关容器时,使用元素索引作为 removedIndex 调用 onDrop() |
| :drop-placeholder | boolean,object | undefined | 占位符的选项。包含 className, animationDuration, showOnTop 例如 dropPlaceholderOptions: { className: “drop-preview”, animationDuration: “150”, showOnTop: true, }, |
Container 属性的使用
onCardDrop(column.id, e)" :get-child-payload="getCardPayload(column.id)" drag-class="card-ghost" drop-class="card-ghost-drop" :drop-placeholder="dropPlaceholderOptions" class="draggable-contain
相关内容
- JavaScript实现简单表单验证案例_javascript技巧_
- Vue3+Element Plus使用svg加载iconfont的处理方法_vue.js_
- TypeScript语法详解之类型操作的补充_javascript技巧_
- JS实现表单验证案例_javascript技巧_
- JavaScript对象的四种创建方法_javascript技巧_
- uniapp小程序视图容器cover-view使用详解_javascript技巧_
- vue项目打包优化的方法实战记录_vue.js_
- js实现本地持久化存储登录注册_javascript技巧_
- Node.js实现登陆注册功能_node.js_
- React配置多个代理实现数据请求返回问题_React_
点击排行
本栏推荐
