网站首页 > 文章精选 正文
前沿介绍
之前vue移动拖拽库使用的是vue-draggable,但扩展性偏弱。而dnd在这方面有优势,需要做这个功能的小伙伴,个人建议优先选择dnd。不过dnd有学习成本。此文章就是希望能降低vue3 dnd的学习成本。
上手思路
因为学习思路有问题,个人上手dnd花费了不少时间,望大家不要重蹈覆辙。官方文档的入门教程是有点整蛊的,说是教程,实则只是一堆api的解释。嚼起来费劲,又没啥用。
个人推荐上手思路:
直接跟着我下面的dnd示例做,跑一遍dnd的流程。dnd的代码量其实很少的,做一遍你就知道dnd是怎么运行的,其实就已经是上手了。
然后根据自己需要的业务,去找dnd的官方示例,官方示例有5大模块,每个模块也就三五示例。里面基本涵盖了dnd能实现的常见功能。找到类似自己的业务的示例后,下载官方源码,自己根据官方文档的api,改造示例代码即可。
我先自吹一波,这一套上手思路,上手速度快,业务实现速度也是杠杠的。大家如果觉得有用,给我文章点个赞哈。话不多说,扬帆起航。
创建一个dnd流程
实现目标:将一个拖拽源拖拽到容器中
创建一个可以被拖拽的拖拽源(Drag)
javascript复制代码<template>
<div :ref="drag"></div>
</template>
<script lang="ts" setup>
import { useDrag } from "vue3-dnd"
// useDrag即生成一个拖拽源,返回一个构建元素的方法(drag),将drag绑到:ref上,就相当于构建在这个元素上了
const [, drag] = useDrag({
type: "acceptType", //拖拽源的类型,用来给接收容器判断是否接受此拖拽源
item: () => { // item是拖拽源的数据,接受容器可以接受到这里面的数据
return { id: props.id }
},
})
监听拖拽源的状态
javascript复制代码<template>
<div :ref="drag"></div>
</template>
<script lang="ts" setup>
import { useDrag } from "vue3-dnd"
// 3.collect是拖拽源状态的收集器,拖拽源的状态变化都会反馈到collect上
const [collect, drag] = useDrag({
type: "acceptType",
item: () => {
return { id: props.id }
},
// 1.monitor:即拖拽源的监控器,拓展源状态变化了,就会更新monitor
collect(monitor){
return {}//2.collect:收集器,return出去的对象会赋值到《const [collect, drag] 》里面的collect
}
})
完整的示例
监听拖拽源是否正在被拖拽中
javascript复制代码<template>
<div :ref="drag"></div>
</template>
<script lang="ts" setup>
import { useDrag } from "vue3-dnd"
// 2.collect是vue的ref方法的返回值,使用时请用collect.value,collect更新会触发update生命周期,会更新依赖
const [collect, drag] = useDrag({
type: "acceptType",
item: () => {
return { id: props.id }
},
collect(monitor) {
return {
//1.将监控器抛出的状态赋值到isDragging
isDragging: monitor.isDragging(),
}
},
})
// 3.监听collect的变化,做相应的逻辑处理
watch(
() => collect.value.isDragging,
(value) => {
if (value) {
console.log("正在被拖拽中")
} else {
console.log("没有在拖拽了")
}
},
)
拖拽源的各种状态变化都在monitor,可查询官方文档api获取自己想监听的状态
创建一个接受拖拽源的容器(Drop)
javascript复制代码<template>
<div :ref="Drop"></div>
</template>
<script lang="ts" setup>
import { useDrop } from "vue3-dnd"
const [collect, Drop] = useDrop({
accept: "acceptType", // 容器允许接收的拖拽源类型,即容器只接收此类型的拖拽源
collect(monitor) {
return {
isOver: monitor.isOver(), // 判断拖拽源是否在容器内
item: monitor.getItem(), //拖拽源传递的数据
}
},
})
//监听collect的变化,做相应的逻辑处理
watch(
() => collect.value,
(value) => {
if (value.isOver) {
console.log("拖拽源移动到容器范围内了")
console.log("这是拖拽源的数据", value.item)
} else {
console.log("拖拽源移动到容器范围外面了")
}
},
{ deep: true },
)
实时监听容器内的情况
####示例 实时监听容器内的拖拽源位置变化
javascript复制代码<template>
<div :ref="Drop"></div>
</template>
<script lang="ts" setup>
import { useDrop } from "vue3-dnd"
const [collect, Drop] = useDrop({
accept: "acceptType",
hover(item,monitor) { //实时监听正在容器内移动的数据源,每个0.1秒左右就触发一次
console.log('拖拽源的数据',item)
console.log('拖拽源的位置',monitor.getClientOffset())
},
})
备注:拖拽源也有自己的实时监听方法,具体方法api请见文档。
- 常用的实时监听事件
名称 | 说明 |
drop() | 拖拽源放置结束后触发事件 |
至此,你已经实现了一个完整的拖拽功能了,想必也理解dnd的运作过程了。如果还不理解,那就回头看看自己的代码,多玩一下自己实现的示例。
如何使用dnd实现自己的业务
实现自己需要的业务时,可先查看官方文档的示例,里面基本涵盖了dnd能实现的常见功能。找到类似自己的业务的示例后,下载官方源码,自己根据官方文档的api,改造示例代码即可。
作者:夏目友人爱吃豆腐
链接:
https://juejin.cn/post/7338605981595566143
猜你喜欢
- 2025-06-18 网页禁止复制粘贴怎么办?教你6招,快速搞定
- 2025-06-18 如何丝滑的实现首页看板拖拉拽功能?
- 2025-06-18 优雅而酷炫的自定义CSS滚动条(css设置div滚动条样式)
- 2025-06-18 怎么将PDF文件转换为HTML?分享四种实用方法
- 2025-06-18 前端人必看!这 10 个 JavaScript 技巧,让你代码效率狂飙 99%!
- 2025-06-18 数据大屏怎么做?这个项目让你轻松拖拽做大屏
- 2025-06-18 前端开发HTML中的Javascript交互图
- 2025-06-18 6个冷门但实用的前端测试及开发相关的chrome浏览器插件
- 2025-06-18 「按键精灵」旋转验证(按键精灵角色转动角度)
- 2025-06-18 基于 vue+element-ui 动态拖拽表单组件NGForm
- 06-18技术分享 | Web自动化之Selenium安装
- 06-18postman系列之批量执行接口测试用例
- 06-18Junit5 架构、新特性及基本使用(常用注解与套件执行)
- 06-18「技术分享」postman完整的接口测试
- 06-18HTTP接口测试工具Postman(接口测试url)
- 06-18postman--实现接口自动化测试(postman接口自动化框架)
- 06-18讲解LDO(讲解的近义词)
- 06-18震撼!2020国际摄影奖获奖佳作欣赏
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)