Vue3實(shí)現(xiàn)可視化拖拽標(biāo)簽小程序功能
介紹
實(shí)現(xiàn)功能:可視化標(biāo)簽拖拽,雙擊標(biāo)簽可修改標(biāo)簽內(nèi)容
HTML結(jié)構(gòu)
<div class="box" v-move> <div class="header">標(biāo)簽1</div> <div @dblclick="startEditing" v-if="!isEditing">{{content}}</div> <input type="text" v-model="editedContent" @blur = 'stopEditing' v-if="isEditing"> </div>
一個(gè)大DIV包含里面存放兩個(gè)DIV一個(gè)input
header為頭部標(biāo)簽名稱(chēng)
內(nèi)容區(qū)域綁定雙擊鼠標(biāo)事件,觸發(fā)開(kāi)始修改事件(startEditing),使用v-if進(jìn)行標(biāo)簽的顯示和隱藏操作
input標(biāo)簽,事件綁定為修改內(nèi)容,綁定獲取焦點(diǎn)事件(@blue=“stopEditing”),并且綁定和內(nèi)容區(qū)域一樣的變量用來(lái)控制顯示隱藏,一方為顯示另一方必定為隱藏
TS部分
import { Directive, DirectiveBinding } from "vue"; const vMove: Directive<any, void> = { mounted(el: HTMLElement, binding: DirectiveBinding) { // 創(chuàng)建一個(gè)變量 moveElement,表示 DOM 元素的子元素(假設(shè)這是要拖動(dòng)的元素) const moveElement: HTMLDivElement = el.firstElementChild as HTMLDivElement; // 鼠標(biāo)按下事件處理函數(shù) const mouseDown = (e: MouseEvent) => { // 計(jì)算鼠標(biāo)相對(duì)于元素的偏移量 const X = e.clientX - el.offsetLeft; const Y = e.clientY - el.offsetTop; // 鼠標(biāo)移動(dòng)事件處理函數(shù) const move = (e: MouseEvent) => { // 更新元素的位置,實(shí)現(xiàn)拖動(dòng)效果 el.style.left = e.clientX - X + "px"; el.style.top = e.clientY - Y + "px"; }; // 添加鼠標(biāo)移動(dòng)事件監(jiān)聽(tīng)器 document.addEventListener("mousemove", move); // 添加鼠標(biāo)松開(kāi)事件監(jiān)聽(tīng)器,用于停止拖動(dòng) document.addEventListener("mouseup", () => { document.removeEventListener("mousemove", move); }); }; // 將鼠標(biāo)按下事件處理函數(shù)添加到元素上 moveElement.addEventListener("mousedown", mouseDown); }, };
采用自定義指令進(jìn)行設(shè)置移動(dòng)組件,Directive 和 DirectiveBinding:這是Vue.js中用于自定義指令的一些類(lèi)型和功能。自定義指令允許你在DOM元素上附加自定義行為。Directive 是自定義指令的基本類(lèi)型,而 DirectiveBinding 是與指令綁定的數(shù)據(jù)的類(lèi)型。
上述代碼定義了一個(gè)名為 vMove 的自定義指令,它會(huì)在元素上附加拖動(dòng)行為。當(dāng)鼠標(biāo)在 moveElement(元素的子元素)上按下時(shí),啟動(dòng)拖動(dòng)操作,通過(guò)鼠標(biāo)移動(dòng)事件更新元素的位置,并在鼠標(biāo)松開(kāi)時(shí)停止拖動(dòng)。這個(gè)自定義指令可以在Vue.js應(yīng)用中使用,將其添加到需要拖動(dòng)的元素上,以實(shí)現(xiàn)拖拽功能。
<script setup lang="ts"> // 導(dǎo)入 Vue 和自定義指令相關(guān)的模塊 import { ref, Directive, DirectiveBinding } from "vue"; // 自定義指令 vMove 的實(shí)現(xiàn) const vMove: Directive<any, void> = (el: HTMLElement, binding: DirectiveBinding) => { // 獲取需要移動(dòng)的 DOM 元素,假設(shè)它是傳入元素的第一個(gè)子元素 let moveElement: HTMLElement = el.firstElementChild as HTMLDivElement; console.log(moveElement); // 鼠標(biāo)按下事件處理函數(shù) const mouseDown = (e: MouseEvent) => { // 計(jì)算鼠標(biāo)點(diǎn)擊位置相對(duì)于元素左上角的偏移量 let X = e.clientX - el.offsetLeft; let Y = e.clientY - el.offsetTop; // 鼠標(biāo)移動(dòng)事件處理函數(shù) const move = (e: MouseEvent) => { console.log(e); // 更新元素的位置,實(shí)現(xiàn)拖動(dòng)效果 el.style.left = e.clientX - X + "px"; el.style.top = e.clientY - Y + "px"; }; // 添加鼠標(biāo)移動(dòng)事件監(jiān)聽(tīng)器,以便拖動(dòng)元素 document.addEventListener("mousemove", move); // 添加鼠標(biāo)松開(kāi)事件監(jiān)聽(tīng)器,停止拖動(dòng) document.addEventListener("mouseup", () => { document.removeEventListener("mousemove", move); }); }; // 將鼠標(biāo)按下事件處理函數(shù)添加到移動(dòng)元素上 moveElement.addEventListener("mousedown", mouseDown); console.log(binding); }; // 使用 ref 創(chuàng)建響應(yīng)式數(shù)據(jù) const content = ref('內(nèi)容'); // 原始內(nèi)容 const isEditing = ref(false); // 是否處于編輯模式 const editedContent = ref(''); // 編輯后的內(nèi)容 // 進(jìn)入編輯模式 const startEditing = () => { isEditing.value = true; editedContent.value = content.value; // 將原始內(nèi)容設(shè)置為編輯后的內(nèi)容 } // 退出編輯模式 const stopEditing = () => { isEditing.value = false; content.value = editedContent.value; // 保存編輯后的內(nèi)容 } </script> <template> <div class="box" v-move> <div class="header">標(biāo)簽1</div> <!-- 使用雙擊事件觸發(fā)編輯模式 --> <div @dblclick="startEditing" v-if="!isEditing">{{ content }}</div> <!-- 編輯模式下顯示輸入框 --> <input type="text" v-model="editedContent" @blur="stopEditing" v-if="isEditing"> </div> </template> <style scoped> .box { position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 200px; height: 200px; border: 3px solid; background: #f59c09; .header { height: 20px; background: #f59c09; color: white; } } </style>
到此這篇關(guān)于Vue3實(shí)現(xiàn)可視化拖拽標(biāo)簽小程序的文章就介紹到這了,更多相關(guān)Vue3拖拽標(biāo)簽小程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nuxt項(xiàng)目支持eslint+pritter+typescript的實(shí)現(xiàn)
這篇文章主要介紹了Nuxt項(xiàng)目支持eslint+pritter+typescript的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05Vue用mixin合并重復(fù)代碼的實(shí)現(xiàn)
這篇文章主要介紹了Vue用mixin合并重復(fù)代碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Vue3中多個(gè)彈窗同時(shí)出現(xiàn)的解決思路
這篇文章主要介紹了Vue3中多個(gè)彈窗同時(shí)出現(xiàn)的解決思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02如何通過(guò)URL來(lái)實(shí)現(xiàn)在Vue中存儲(chǔ)業(yè)務(wù)狀態(tài)實(shí)用技巧
這篇文章主要為大家介紹了如何通過(guò)URL來(lái)實(shí)現(xiàn)在Vue中存儲(chǔ)業(yè)務(wù)狀態(tài)實(shí)用技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Vue遞歸實(shí)現(xiàn)樹(shù)形菜單方法實(shí)例
學(xué)習(xí)vue有一段時(shí)間了,最近使用vue做了一套后臺(tái)管理系統(tǒng),其中使用最多就是遞歸組件,下面這篇文章主要給大家介紹了關(guān)于Vue利用遞歸實(shí)現(xiàn)樹(shù)形菜單的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-11-11vue修改打包配置如何實(shí)現(xiàn)代碼打包后的自定義命名
這篇文章主要介紹了vue修改打包配置如何實(shí)現(xiàn)代碼打包后的自定義命名,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05