Vue自定義指令最佳實踐教程

Vue 3 顯著增強了自定義指令的功能,使其封裝更加靈活和易用。本文將分為基礎和進階兩部分,介紹如何實現常用的自定義指令,并提供最佳的項目組織方式。

前言

  • 本文以復制文本的自定義指令詳細介紹自定義指令的基礎知識

  • 多個自定義指令如何進行代碼及目錄的組織

  • 如何更好的進行方法抽離使公共方法和自定義指令進行解耦

  • 自定義指令的高階用法

1. 指令生命周期

Vue 3 自定義指令的生命周期如下:

  1. created:指令綁定到元素上時調用,且只調用一次。

  2. beforeMount:在元素插入 DOM 之前調用。

  3. mounted:元素插入 DOM 后調用。

  4. beforeUpdate:更新包含綁定值的元素時調用,發生在更新前。

  5. updated:更新包含綁定值的元素后調用。

  6. beforeUnmount:在綁定元素從 DOM 中移除前調用。

  7. unmounted:綁定元素從 DOM 中移除后調用。

通過這些生命周期,可以實現復雜的邏輯,例如初始化資源、監聽事件或清理操作。

2. 基礎部分:v-copy 指令

目標:實現一個簡單的復制文本功能。

實現代碼

將復制文本的邏輯單獨抽離為工具函數:

// src/utils/copyToClipboard.js
export function copyToClipboard(text) {const input = document.createElement('textarea');input.value = text;document.body.appendChild(input);input.select();try {document.execCommand('copy');document.body.removeChild(input);return true;} catch (err) {document.body.removeChild(input);throw new Error('復制失敗');}
}

封裝 v-copy 指令:

// src/directives/copy.js
import { copyToClipboard } from '../utils/copyToClipboard';
import { isFunction } from '../utils/isType';
export default {mounted(el, binding) {const handleClick = () => {try {copyToClipboard(binding.value);console.log('復制成功!');} catch (err) {console.error('復制失敗:', err);}};el.__handleClick__= handleClick;el.removeEventListener('click', el.__handleClick__);el.addEventListener('click', handleClick);},unmounted(el) {el.removeEventListener('click', el.__handleClick__);delete el.__handleClick__;},
};

使用方式

在 Vue 項目中全局注冊指令:

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import copyDirective from './directives/copy';
const app = createApp(App);
app.directive('copy', copyDirective);
app.mount('#app');

在組件中使用:

<template><button v-copy="'這是復制的文本'">點擊復制</button>
</template>

3. 進階部分:完善的 v-copy 指令

目標:增強功能,支持成功和失敗的事件回調。

實現代碼

// src/directives/copy.js
import { copyToClipboard } from '../utils/copyToClipboard';
import { isFunction } from '../utils/isType';
export default {mounted(el, binding) {const handleClick = () => {const { success, error } = binding.arg || {};try {copyToClipboard(binding.value);if (isFunction(success)) {success();}} catch (err) {if (isFunction(error)) {error(err);}}};el.__handleClick__ = handleClick;el.removeEventListener('click', el.__handleClick__);el.addEventListener('click', handleClick);},unmounted(el) {el.removeEventListener('click', el.__handleClick__);delete el.__handleClick__;},
};

使用方式

<template><buttonv-copy:success="onCopySuccess"v-copy:error="onCopyError"v-copy="'高級復制文本'">高級復制按鈕</button>
</template>
<script>
export default {methods: {onCopySuccess() {alert('復制成功!');},onCopyError(err) {alert('復制失敗:' + err.message);},},
};
</script>

4. 指令參數說明

  1. binding.value:指令綁定的值,在這里是需要復制的文本。

  2. binding.arg:可選參數,例如用于傳遞回調函數(如 successerror)。

  3. binding.modifiers:修飾符對象,可用于定義指令的額外行為(如條件觸發等)

5. 多指令項目的目錄結構

當項目中包含多個自定義指令時,建議按照以下方式組織:

src/
├── directives/
│   ├── index.js         # 統一導出所有指令
│   ├── copy.js          # 復制指令
│   ├── focus.js         # 聚焦指令
│   └── lazy-load.js     # 圖片懶加載指令
├── utils/
│   ├── copyToClipboard.js # 工具函數
│   └── isType.js         # 類型判斷工具

統一導出指令

// src/directives/index.js
import copy from './copy';
import focus from './focus';
import lazyLoad from './lazy-load';
export default {copy,focus,lazyLoad,
};

全局注冊指令

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import directives from './directives';
const app = createApp(App);
Object.keys(directives).forEach((key) => {app.directive(key, directives[key]);
});
app.mount('#app');

通過這樣的目錄結構,指令的維護和擴展將更加方便有序。如果需要新增指令,只需在 directives 目錄中添加對應的文件并更新 index.js 即可。

希望本文能夠幫助您更好地掌握 Vue 3 的自定義指令開發!

6.團隊介紹

三翼鳥數字化技術平臺-定制平臺開發」主要負責設計工具的研發,包括營銷設計工具、家電VR設計和展示、水電暖通前置設計能力,研發并沉淀素材庫,構建家居家裝素材庫,集成戶型庫、全品類產品庫、設計方案庫、生產工藝模型,打造基于戶型和風格的AI設計能力,快速生成算量和報價;同時研發了門店設計師中心和項目中心,包括設計師管理能力和項目經理管理能力。實現了場景全生命周期管理,同時為水,空氣,廚房等產業提供商機管理工具,從而實現了以場景貫穿的B端C端全流程系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75577.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用DrissionPage升級維基百科爬蟲:更簡潔高效的數據抓取方案

一、原方案痛點分析 原代碼使用urllibBeautifulSoup組合存在以下問題&#xff1a; 動態內容缺失&#xff1a;無法獲取JavaScript渲染后的頁面內容 反爬能力弱&#xff1a;基礎請求頭易被識別為爬蟲 代碼冗余&#xff1a;需要單獨處理SSL證書驗證 擴展性差&#xff1a;難以應…

23種設計模式-結構型模式-代理

文章目錄 簡介問題解決方案代碼核心設計要點 總結 簡介 代理是一種結構型設計模式&#xff0c;讓你能夠提供對象的替代品或其占位符。代理控制著對于原對象的訪問&#xff0c;并允許在把請求提交給對象前后進行一些處理。 問題 為什么要控制對于某個對象的訪問呢&#xff1f…

基于Transformer框架實現微調后Qwen/DeepSeek模型的非流式批量推理

在基于LLamaFactory微調完具備思維鏈的DeepSeek模型之后(詳見《深入探究LLamaFactory推理DeepSeek蒸餾模型時無法展示<think>思考過程的問題》),接下來就需要針對微調好的模型或者是原始模型(注意需要有一個本地的模型文件,全量微調就是saves下面的文件夾,如果是LoRA,…

基于OpenCV的指紋驗證:從原理到實戰的深度解析

指紋識別的技術革命與OpenCV的輕量級方案 在生物特征識別領域&#xff0c;指紋識別始終以獨特性和穩定性占據核心地位。隨著OpenCV等開源視覺庫的普及&#xff0c;這項看似"高大上"的技術正逐步走向民用化開發。本文將突破傳統算法框架&#xff0c;提出一套基于OpenC…

十五屆藍橋杯省賽Java B組(持續更新..)

目錄 十五屆藍橋杯省賽Java B組第一題&#xff1a;報數第二題&#xff1a;類斐波那契數第三題&#xff1a;分布式隊列第四題&#xff1a;食堂第五題&#xff1a;最優分組第六題&#xff1a;星際旅行第七題&#xff1a;LITS游戲第八題&#xff1a;拼十字 十五屆藍橋杯省賽Java B…

多模態學習(八):2022 TPAMI——U2Fusion: A Unified Unsupervised Image Fusion Network

論文鏈接&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9151265 目錄 一.摘要 1.1 摘要翻譯 1.2 摘要解析 二.Introduction 2.1 Introduciton翻譯 2.2 Introduction 解析 三. related work 3.1 related work翻譯 3.2 relate work解析 四…

電腦屏幕亮度隨心控,在Windows上自由調整屏幕亮度的方法

調整電腦屏幕的亮度對于保護視力和適應不同環境光線條件非常重要。無論是在白天強光下還是夜晚昏暗環境中&#xff0c;合適的屏幕亮度都能讓您的眼睛更加舒適。本文中簡鹿辦公小編將向您介紹幾種在 Windows 系統中調整屏幕亮度的方法。 方法一&#xff1a;使用快捷鍵 大多數筆…

AF3 OpenFoldDataset類looped_samples方法解讀

AlphaFold3 data_modules 模塊的 OpenFoldDataset 類的 looped_samples 方法用于 循環采樣數據,確保數據能被不斷地提供,適用于 PyTorch 的 DataLoader 在訓練過程中迭代讀取數據。dataset_idx 指定了當前要處理的數據集(即 self.datasets[dataset_idx]) 源代碼: def loo…

lua表table和JSON字符串互轉

--print("local ssxc{\n"..string.gsub(str,":","").."\n}") Utils {} ---------------------------------------------------------------------------------- -- Lua-Table 與 string 轉換 local function value2string(value, isA…

請談談分治算法,如何應用分治算法解決大規模問題?

分治算法實戰解析與前端應用指南 分治算法本質剖析 分治算法的核心在于"分而治之"&#xff0c;其工作流程可分解為三個關鍵階段&#xff1a; 分解階段&#xff08;Divide&#xff09;&#xff1a;將復雜問題拆分為若干個相互獨立的子問題攻克階段&#xff08;Conqu…

基于BusyBox構建ISO鏡像

1. 準備 CentOS 7.9 3.10.0-957.el7.x86_64VMware Workstation 建議&#xff1a;系統內核<3.10.0 使用busybox < 1.33.2版本 2. 安裝busybox # 安裝依賴 yum install syslinux xorriso kernel-devel kernel-headers glibc-static ncurses-devel -y# 下載 wget https://…

Node.js 與 MySQL:深入理解與高效實踐

Node.js 與 MySQL:深入理解與高效實踐 引言 隨著互聯網技術的飛速發展,Node.js 作為一種高性能的服務端JavaScript運行環境,因其輕量級、單線程和事件驅動等特點,受到了廣大開發者的青睞。MySQL 作為一款開源的關系型數據庫管理系統,以其穩定性和可靠性著稱。本文將深入…

Android學習總結之handler源碼級

一、核心類關系與線程綁定&#xff08;ThreadLocal 的核心作用&#xff09; 1. Looper 與 ThreadLocal 的綁定 每個線程的 Looper 實例通過 ThreadLocal<Looper> sThreadLocal 存儲&#xff0c;確保線程隔離&#xff1a; public final class Looper {// 線程本地存儲&…

群體智能優化算法-算術優化算法(Arithmetic Optimization Algorithm, AOA,含Matlab源代碼)

摘要 算術優化算法&#xff08;Arithmetic Optimization Algorithm, AOA&#xff09;是一種新穎的群體智能優化算法&#xff0c;靈感來源于加、減、乘、除四種基本算術運算。在優化過程中&#xff0c;AOA 通過乘除操作實現全局探索&#xff0c;通過加減操作強化局部開發&#…

廣告推薦算法:COSMO算法與A9算法的對比

COSMO算法與A9算法的概念解析 1. A9算法 定義與背景&#xff1a; A9算法是亞馬遜早期為電商平臺研發的核心搜索算法&#xff0c;主要用于優化商品搜索結果的排序和推薦&#xff0c;其核心邏輯圍繞產品屬性與關鍵詞匹配展開。自2003年推出以來&#xff0c;A9通過分析商品標題…

EasyExcel 數據字典轉換器實戰:注解驅動設計

一、場景痛點與解決方案 1. 問題背景 在 Excel 導入導出場景中&#xff0c;開發者常面臨以下問題&#xff1a; 數據可讀性差&#xff1a;數據庫存儲的字典值&#xff08;如 1、true&#xff09;直接導出時難以理解雙向轉換復雜&#xff1a;導入時需將用戶輸入的標簽反向解析…

五種音頻器件綜合對比——《器件手冊--音頻器件》

目錄 音頻器件 簡述 1. 揚聲器&#xff08;Speakers&#xff09; 2. 麥克風&#xff08;Microphones&#xff09; 3. 放大器&#xff08;Amplifiers&#xff09; 4. 音頻接口&#xff08;Audio Interfaces&#xff09; 5. 音頻處理器&#xff08;Audio Processors&#xff09…

紅寶書第二十九講:詳解編輯器和IDE:VS Code與WebStorm

紅寶書第二十九講&#xff1a;詳解編輯器和IDE&#xff1a;VS Code與WebStorm 資料取自《JavaScript高級程序設計&#xff08;第5版&#xff09;》。 查看總目錄&#xff1a;紅寶書學習大綱 一、核心區別&#xff1a;編輯器與IDE 代碼編輯器&#xff08;如VS Code&#xff09…

虛擬電商-話費充值業務(五)充值成功邏輯和網絡異常重試邏輯

一、網絡異常重試邏輯編寫 如果在對接供應商的過程中出現了網絡異常&#xff0c;我們需要做一個補償機制&#xff0c;在任務類型枚舉類&#xff1a;TaskTypeEnum中有一種業務狀態碼是針對遠程調用失敗的 步驟一&#xff1a;在對接供應商的方法&#xff1a;SupplierServiceImp…

從零構建大語言模型全棧開發指南:第四部分:工程實踐與部署-4.3.3低代碼開發:快速構建行業應用(電商推薦與金融風控案例)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 從零構建大語言模型全棧開發指南-第四部分:工程實踐與部署4.3.3 低代碼開發:快速構建行業應用(電商推薦與金融風控案例)1. 低代碼與AI結合的核心價值2. 電商推薦系統案例2.1 技術架構與實現2.2 性能…