Vue 自定義指令實現(xiàn)一鍵 Copy功能
先看下效果圖:
指令是啥?
按照慣例,先請出官方的解釋:
指令 (Directives) 是帶有 v- 前綴的特殊特性。指令特性的值預(yù)期是單個 JavaScript 表達式 (v-for 是例外情況,稍后我們再討論)。指令的職責(zé)是,當(dāng)表達式的值改變時,將其產(chǎn)生的連帶影響,響應(yīng)式地作用于 DOM。
再按照慣例,大家 ( 假裝 ) 看不懂,然后我來舉個栗子解釋一番。。。好,還是不知所云,本文結(jié)束 ( Ctrl + F4 ) ,下一篇。
為了避免上述情況出現(xiàn),就不解釋了。實際上官方提供了很多內(nèi)置指令,如: v-if 、 v-for 、 v-bind and so on。每一個指令都有自己特定的功能。
自定義指令
顧名思義就是自己定義的指令啦,可以實現(xiàn)我們想要的功能。下面就實現(xiàn)一個 一鍵 Copy 的功能吧。
生命周期
首先簡單瞟一下指令的語法,每個指令都有自己的生命周期,看到生命周期,肯定會想到鉤子函數(shù),沒錯,指令也提供了鉤子函數(shù):
- bind:指令第一次綁定到元素時調(diào)用,此鉤子只會調(diào)用一次。在這里可以進行一次性的初始化設(shè)置。
- inserted:被綁定元素插入父節(jié)點時調(diào)用 (僅保證父節(jié)點存在,但不一定已被插入文檔中)。
- update:所在組件的 VNode 更新時調(diào)用,但是可能發(fā)生在其子 VNode 更新之前。指令的值可能發(fā)生了改變,也可能沒有。
- componentUpdated:指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。
- unbind:只調(diào)用一次,指令與元素解綁時調(diào)用。
下面再簡單瞟一眼上述鉤子函數(shù)的參數(shù)哈:
- el :指令所綁定的元素,可以用來直接操作 DOM 。
- binding :一個對象,包含以下屬性:
- name :指令名,不包括 v- 前綴。
- value :指令的綁定值,例如: v-my-directive="1 + 1" 中,綁定值為 2 。
- oldValue :指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
- expression :字符串形式的指令表達式。例如 v-my-directive="1 + 1" 中,表達式為 " 1 + 1 "。
- arg :傳給指令的參數(shù),可選。例如 v-my-directive:foo 中,參數(shù)為 " foo "。
- modifiers :一個包含修飾符的對象。例如: v-my-directive.foo.bar 中,修飾符對象為 { foo: true, bar: true } 。
- vnode : Vue 編譯生成的虛擬節(jié)點。移步 VNode API 來了解更多詳情。
- oldVnode :上一個虛擬節(jié)點,僅在 update 和 componentUpdated 鉤子中可用。
看起來還挺多的,不過別方,其實常用的就幾個。好了下面要開始表演了:
首先建一個 js 文件(v-copy.js)。定義一個對象。( 指令實際就是一個對象 )
import { Message } from 'ant-design-vue'; const vCopy = { // 名字愛取啥取啥 /* bind 鉤子函數(shù),第一次綁定時調(diào)用,可以在這里做初始化設(shè)置 el: 作用的 dom 對象 value: 傳給指令的值,也就是我們要 copy 的值 */ bind(el, { value }) { el.$value = value; // 用一個全局屬性來存?zhèn)鬟M來的值,因為這個值在別的鉤子函數(shù)里還會用到 el.handler = () => { if (!el.$value) { // 值為空的時候,給出提示,我這里的提示是用的 ant-design-vue 的提示,你們隨意 Message.warning('無復(fù)制內(nèi)容'); return; } // 動態(tài)創(chuàng)建 textarea 標簽 const textarea = document.createElement('textarea'); // 將該 textarea 設(shè)為 readonly 防止 iOS 下自動喚起鍵盤,同時將 textarea 移出可視區(qū)域 textarea.readOnly = 'readonly'; textarea.style.position = 'absolute'; textarea.style.left = '-9999px'; // 將要 copy 的值賦給 textarea 標簽的 value 屬性 textarea.value = el.$value; // 將 textarea 插入到 body 中 document.body.appendChild(textarea); // 選中值并復(fù)制 textarea.select(); textarea.setSelectionRange(0, textarea.value.length); const result = document.execCommand('Copy'); if (result) { Message.success('復(fù)制成功'); } document.body.removeChild(textarea); }; // 綁定點擊事件,就是所謂的一鍵 copy 啦 el.addEventListener('click', el.handler); }, // 當(dāng)傳進來的值更新的時候觸發(fā) componentUpdated(el, { value }) { el.$value = value; }, // 指令與元素解綁的時候,移除事件綁定 unbind(el) { el.removeEventListener('click', el.handler); }, }; export default vCopy;
到這里,一鍵 Copy 的功能就實現(xiàn)了,最后再說一嘴怎么將自定義指令注冊到全局:再新建一個 js ( directives.js )文件來注冊所有的全局指令。
import copy from './v-copy'; // 自定義指令 const directives = { copy, }; // 這種寫法可以批量注冊指令 export default { install(Vue) { Object.keys(directives).forEach((key) => { Vue.directive(key, directives[key]); }); }, };
最后,在 main.js 中這樣引入:
import Vue from 'vue'; import Directives from './directives'; Vue.use(Directives);
最后的最后,說一下怎么用吧。。
<template> <button v-copy="copyText">copy</button> </template> <script> export default { data() { return { copyText: '要 Copy 的內(nèi)容', }; }, }; </script>
總結(jié)
以上所述是小編給大家介紹的Vue 自定義指令實現(xiàn)一鍵 Copy功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
vue2使用el-tag實現(xiàn)自定義菜單導(dǎo)航標簽
這篇文章主要為大家詳細介紹了vue2如何使用el-tag實現(xiàn)自定義菜單導(dǎo)航標簽,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12element-plus 如何設(shè)置 el-date-picker 彈出框位置
el-date-picker 組件會自動根據(jù)空間范圍進行選擇比較好的彈出位置,但特定情況下,它自動計算出的彈出位置并不符合我們的實際需求,故需要我們手動設(shè)置,這篇文章主要介紹了element-plus 如何設(shè)置 el-date-picker 彈出框位置,需要的朋友可以參考下2024-07-07vue-element-admin?登陸及目錄權(quán)限控制的實現(xiàn)
本文主要介紹了vue-element-admin?登陸及目錄權(quán)限控制的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04vue3+Element采用遞歸調(diào)用封裝導(dǎo)航欄實現(xiàn)
本文主要介紹了vue3+Element采用遞歸調(diào)用封裝導(dǎo)航欄,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06vue中給el-radio添加tooltip并實現(xiàn)點擊跳轉(zhuǎn)方式
這篇文章主要介紹了vue中給el-radio添加tooltip并實現(xiàn)點擊跳轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04