vue3.0拖拽缩放组件

秒速五厘米 2023-01-10 13:26 365阅读 0赞

本人开发vue3.0拖拽缩放组件,持续更新中 (最新版本 0.3.0 支持 拖拽 、缩放、旋转、移动辅助线、激活和取消激活、复制粘贴、删除、键盘移动等功能,预计加入撤回操作、多选全选等功能)

  1. github地址: https://github.com/zzz0908/vue3-resize-drag
  2. npmjs地址: https://www.npmjs.com/package/vue3-resize-drag

demo:
在这里插入图片描述

文档

vue3.0拖拽缩放插件

  1. 下载并引入
  2. npm i vue3-resize-drag -S
  3. yarn add vue3-resize-drag -S
  4. import vue3ResizeDrag from 'vue3-resize-drag'
  5. const app = createApp(App)
  6. app.use(vue3ResizeDrag)
  7. ## 注意:
  8. 如果vue3.0中使用ts了,那么请在src/shims-vue.d.ts声明文件中加入此插件声明:
  9. declare module 'vue3-resize-drag'

组件用法: setup代码可抽离到其他文件,这里为了方便观看就放一起了

  1. <template>
  2. <vue3ResizeDrag
  3. v-for="item in data.data"
  4. :key="item.name"
  5. :x="item.x" <!-- x 为组件left位置 -->
  6. :y="item.y" <!-- y 为组件top位置 -->
  7. :w="100" <!-- 组件宽度 默认为100 -->
  8. :h="100" <!-- 组件高度 默认为100 -->
  9. :zIndex="1" <!-- 组件层级大小 -->
  10. @moveHandler="moveHandler" <!-- 组件移动回调 -->
  11. @mouseUpHandler="mouseUpHandler" <!-- 组件移动结束回调 -->
  12. @downHandler="downHandler" <!-- 移动开始之前回调 -->
  13. :isDraggable="item.drag" <!-- 是否可移动 默认为true -->
  14. :isResizable="item.resize" <!-- 是否可缩放 默认为true -->
  15. :isRotate="item.rotate" <!-- 是否可旋转 默认为false -->
  16. :isActive="item.active" <!-- 是否激活 默认为false -->
  17. :rotate="0" <!-- 旋转角度 默认为0 -->
  18. @resizeHandler="resizeHandler" <!-- 缩放回调函数 -->
  19. @rotateHandler="rotateHandler" <!-- 旋转回调函数 -->
  20. :resizeIconSize="8" <!-- 缩放按钮大小 默认为8px -->
  21. :isGuide="true" <!-- 是否开启辅助线 默认为false -->
  22. :guideStyle="{}" <!-- 辅助线样式 -->
  23. @activated="activated" <!-- 激活回调函数 -->
  24. @deactivated="deactivated" <!-- 取消激活回调函数 -->
  25. @mousedown="activeMouseDown(item,index)" <!-- 激活点击 -->
  26. >
  27. {
  28. {item.name}}
  29. </vue3ResizeDrag>
  30. </template>
  31. <script lang="ts">
  32. import { defineComponent ,reactive,ref} from 'vue';
  33. export default defineComponent({
  34. name: 'entry',
  35. setup() {
  36. let data = reactive({
  37. data:[
  38. {
  39. x:100,
  40. y:100,
  41. name:'哈哈',
  42. drag:false,
  43. resize:true,
  44. rotate:true,
  45. active:false
  46. },
  47. {
  48. x:200,
  49. y:200,
  50. name:'哈哈2',
  51. drag:true,
  52. resize:true,
  53. rotate:true,
  54. active:true
  55. }
  56. ]
  57. })
  58. const moveHandler = (data:object) => {
  59. console.log(data,'移动')
  60. }
  61. const downHandler = (data:object) => {
  62. console.log(data,'按下')
  63. }
  64. const mouseUpHandler = (data:object) => {
  65. console.log(data,'抬起')
  66. }
  67. const resizeHandler = (data: object) => {
  68. console.log(data,'缩放')
  69. }
  70. const rotateHandler = (data: object) => {
  71. console.log(data,'旋转')
  72. }
  73. const activated = (data: object) => {
  74. console.log(data,'激活')
  75. }
  76. const deactivated = (data: object) => {
  77. console.log(data,'取消激活')
  78. }
  79. let currentIndex = ref(-1) // 临时存储当前激活组件的index
  80. // 自制激活事件 点击组件激活
  81. const activeMouseDown = (item:any,index: number) => {
  82. if(currentIndex.value === index) return
  83. console.log(data)
  84. data.data.forEach((item,i) => {
  85. if(i === index){
  86. item['active'] = true
  87. }else{
  88. item['active'] = false
  89. }
  90. })
  91. currentIndex.value = index
  92. }
  93. // 保存复制的数据
  94. let copyData = reactive<any>({
  95. allData:[],
  96. copy:{}
  97. })
  98. document.onkeydown = function(e:any){ // 绑定键盘事件
  99. e = e || window.event; //标准化事件处理
  100. if (e.keyCode == 46) { // delete 按键盘delete删除
  101. data.data = data.data.filter((item,index) => index != currentIndex.value)
  102. } else if (e.ctrlKey && e.keyCode == 67) { // Ctrl + C // 复制
  103. if(currentIndex.value >= 0){
  104. copyData.allData = [...data.data]
  105. copyData.copy = JSON.parse(JSON.stringify(copyData.allData[currentIndex.value]))
  106. }
  107. } else if (e.ctrlKey && e.keyCode == 86) { // Ctrl + V // 粘贴
  108. copyData.allData.push(copyData.copy)
  109. data.data = copyData.allData
  110. } else if (e.ctrlKey && e.keyCode == 90) { // Ctrl + Z // 撤回
  111. // 暂时没写
  112. } else if (e.ctrlKey) {
  113. // 暂时没写
  114. }else if(e.keyCode == 37 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40){ // 键盘上下左右移动激活中的组件
  115. // 左 上 右 下
  116. if(currentIndex.value >= 0){
  117. switch (e.keyCode) {
  118. case 37:
  119. data.data[currentIndex.value].x --
  120. break;
  121. case 38:
  122. data.data[currentIndex.value].y --
  123. break;
  124. case 39:
  125. data.data[currentIndex.value].x ++
  126. break;
  127. case 40:
  128. data.data[currentIndex.value].y ++
  129. break;
  130. }
  131. }
  132. }
  133. }
  134. return {
  135. data,
  136. moveHandler,
  137. downHandler,
  138. mouseUpHandler,
  139. resizeHandler,
  140. rotateHandler,
  141. deactivated,
  142. activated,
  143. activeMouseDown
  144. }
  145. }
  146. });
  147. </script>

发表评论

表情:
评论列表 (有 0 条评论,365人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue3.0组件

    本人开发vue3.0拖拽缩放组件,持续更新中 (最新版本 0.3.0 支持 拖拽 、缩放、旋转、移动辅助线、激活和取消激活、复制粘贴、删除、键盘移动等功能,预计加入撤回操作、多