随笔 - 73,  文章 - 0,  评论 - 6,  阅读 - 91554

前言

  很多时候我们写的方法是通用的,这个时候根据使用场景可以选择放在js或者ts文件并让其他文件引入使用,但如果是对现有组件添加新功能的话,还是建议用自定义指令更方便。

 

设置v-draggin来操作dom元素的拖拽

1. 在main.js 全局添加自定义指令

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const app = createApp(App)
 
app.directive('dragging',{
    mounted(el, binding, vnode) {
        // console.log(el, binding, vnode);
 
        el.addEventListener('mousedown', (e:any) => {
            // console.log(e);
            let ol = e.clientX - el.offsetLeft;
            let ot = e.clientY - el.offsetTop;
 
            // 给document绑定一个onmousemove事件
          document.onmousemove = function(e2:any) {
            e2 = e2 || window.event;
            let left = e2.clientX - ol;
            let top = e2.clientY - ot;
    
            //修改el的位置
            el.style.left = left + "px";
            el.style.top = top + "px";
          };
    
          document.onmouseup = function() {
            document.onmousemove = null;
            document.onmouseup = null;
          };
        })
    }
});

  

2. 在需要使用拖拽功能的dom元素上添加v-dragging

1
2
3
<div id="imgId" width="125" height="125" v-dragging ></div>
 
<img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" v-dragging />

  

如果需要在UI组件例如ant vue这样的使用,则需要修改代码

main.ts :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const app = createApp(App)
 
app.directive('dragging',{
    mounted(el, binding, vnode) {
        // console.log(el, binding, vnode);
        el = el.parentNode.parentElement; //定位到父级元素
 
        el.addEventListener('mousedown', (e:any) => {
            // console.log(e);
            let ol = e.clientX - el.offsetLeft;
            let ot = e.clientY - el.offsetTop;
 
            // 给document绑定一个onmousemove事件
          document.onmousemove = function(e2:any) {
            e2 = e2 || window.event;
            let left = e2.clientX - ol;
            let top = e2.clientY - ot;
    
            //修改el的位置
            el.style.left = left + "px";
            el.style.top = top + "px";
          };
    
          document.onmouseup = function() {
            document.onmousemove = null;
            document.onmouseup = null;
          };
        })
    }
});

 页面内:

1
2
3
4
5
6
7
<a-button type="primary" @click="showModal">Open Modal {{ visible }} </a-button>
 
<a-modal v-model:visible="visible" title="Basic Modal" @ok="handleOk" >
    <p v-dragging>Some contents...</p>
    <p>Some contents...</p>
    <p>Some contents...</p>
</a-modal>

  效果图:

 

posted on   Tom最好的朋友是Jerry  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示