基于Vue3+TS的自定義指令開發與業務場景應用

文章目錄

  • 1. 前言
  • 2. 基礎概念與優勢?
  • 3. Vue3+TS自定義指令的創建與注冊?
    • 3.1. 創建自定義指令?
    • 3.2. 注冊自定義指令?
  • 4. 實際場景示例?
    • 4.1. 權限指令控制?
    • 4.2. 圖片懶加載指令?
  • 5. 優化與注意事項?

1. 前言

在 Vue3 的開發生態中,自定義指令是一項極為靈活且強大的功能,它允許開發者對 DOM 元素進行底層操作,實現復用性高的特定邏輯。結合 TypeScript(TS)強類型的特性,能讓自定義指令的開發更加規范、安全,減少運行時錯誤。本文將深入講解基于 Vue3 + TS 的自定義指令開發,并通過實際的業務場景做一些示例。?

2. 基礎概念與優勢?

在 Vue 中,指令(Directives)是以v-為前綴的特殊屬性,用于在模板中實現對 DOM 的操作。除了 Vue 自帶的指令(如v-bind、v-on),開發者還可以根據業務需求創建自定義指令。自定義指令的核心作用是抽象出可復用的 DOM 操作邏輯,將其封裝在指令中,在不同組件中重復使用,從而提高代碼的復用性和開發效率。?

Vue3 + TS 開發自定義指令的優勢?:

  • 類型安全:TypeScript 的強類型系統能在開發階段就檢測出類型不匹配等錯誤,避免因數據類型問題導致的運行時錯誤。例如,在定義指令的鉤子函數參數類型時,明確的類型聲明能讓開發者更清晰地知道每個參數的用途和數據類型,同時在編輯器中獲得智能提示,提升編碼效率。?

  • 代碼規范與維護性:TS 的類型定義和接口約束,能讓代碼結構更加清晰。團隊成員可以通過類型聲明快速理解代碼意圖,降低代碼維護成本。在大型項目中,統一的類型規范有助于保持代碼風格的一致性,減少溝通成本。?

  • 更好的代碼重構支持:當項目需求變更,需要對自定義指令進行重構時,TS 強大的類型檢查機制能幫助開發者快速定位因代碼修改導致的類型錯誤,確保重構后的代碼邏輯正確,降低重構風險。?

3. Vue3+TS自定義指令的創建與注冊?

下面是一個完整的流程示例:

3.1. 創建自定義指令?

在 Vue3 中,使用app.directive方法來注冊自定義指令。結合 TS,我們可以通過定義接口和類型別名來規范指令的參數和鉤子函數。

以下是一個簡單的示例,創建一個自定義指令v-focus,用于在元素插入 DOM 時自動獲取焦點:?
?

import { App, Directive, DirectiveBinding } from 'vue';?
?
// 定義指令鉤子函數的參數類型?
interface FocusDirectiveBinding extends DirectiveBinding {?value: boolean;?
}?
?
// 創建自定義指令?
const focusDirective: Directive<HTMLElement, FocusDirectiveBinding> = {?// 當指令綁定到元素時調用?mounted(el: HTMLElement, binding: FocusDirectiveBinding) {?if (binding.value) {?el.focus();?}?}?
};?
?
export default focusDirective;?

在上述代碼中:?

  • 首先導入了App、Directive和DirectiveBinding等類型,用于定義指令相關的類型和接口。?
  • 接著定義了FocusDirectiveBinding接口,擴展了DirectiveBinding,明確了指令綁定值value的類型為boolean。?
  • 然后創建了focusDirective,它是一個實現了Directive接口的對象,包含了mounted鉤子函數。在mounted鉤子中,根據binding.value的值判斷是否讓元素獲取焦點。?

3.2. 注冊自定義指令?

注冊自定義指令有兩種方式:全局注冊和局部注冊。?

全局注冊:在main.ts文件中,將自定義指令注冊到整個 Vue 應用中,使其在所有組件中都可用。?

import { createApp } from 'vue';?
import App from './App.vue';?
import focusDirective from './directives/focus';?
?
const app = createApp(App);?
app.directive('focus', focusDirective);?
app.mount('#app');?

局部注冊:在組件內部注冊自定義指令,僅在當前組件及其子組件中生效。?

	<template>?<input v-focus="isFocused" type="text" />?</template>??<script lang="ts">?import { defineComponent } from 'vue';?import focusDirective from '../directives/focus';??export default defineComponent({?directives: {?focus: focusDirective?},?data() {?return {?isFocused: true?};?}?});?
</script>

4. 實際場景示例?

下面列舉了幾個使用例子,都是開發過程中會碰到的典型示例。

4.1. 權限指令控制?

在企業級應用中,經常需要根據用戶的權限來控制某些 DOM 元素的顯示或隱藏。例如,只有管理員用戶才能看到刪除按鈕,普通用戶則隱藏該按鈕。?

import { App, Directive, DirectiveBinding } from 'vue';?
?
// 定義權限指令的綁定值類型?
interface PermissionDirectiveBinding extends DirectiveBinding {?value: string[];?
}?
?
// 創建權限指令?
const permissionDirective: Directive<HTMLElement, PermissionDirectiveBinding> = {?mounted(el: HTMLElement, binding: PermissionDirectiveBinding) {?const userPermissions = ['admin']; // 模擬用戶權限列表?const requiredPermissions = binding.value;?if (!userPermissions.some(p => requiredPermissions.includes(p))) {?el.style.display = 'none';?}?}?
};?
?
export default permissionDirective;?

在模板中使用該指令:?

<template>?<button v-permission="['admin']">刪除</button>?
</template>

4.2. 圖片懶加載指令?

在圖片較多的頁面,使用懶加載可以提升頁面加載性能。通過自定義指令實現圖片的懶加載功能:?

import { App, Directive, DirectiveBinding } from 'vue';?
import { IntersectionObserver } from '@w3c/IntersectionObserver';?
?
// 定義懶加載指令的綁定值類型?
interface LazyLoadDirectiveBinding extends DirectiveBinding {?value: string;?
}?
?
// 創建懶加載指令?
const lazyLoadDirective: Directive<HTMLImageElement, LazyLoadDirectiveBinding> = {?mounted(el: HTMLImageElement, binding: LazyLoadDirectiveBinding) {?const observer = new IntersectionObserver(([entry]) => {?if (entry.isIntersecting) {?el.src = binding.value;?observer.unobserve(el);?}?});?observer.observe(el);?}?
};?
?
export default lazyLoadDirective;?

在模板中使用該指令:?

<template>?<img v-lazy-load="imageUrl" alt="懶加載圖片" />?
</template>

5. 優化與注意事項?

  • 緩存 DOM 操作:在指令的鉤子函數中,如果涉及多次對 DOM 元素的相同操作,可以將結果緩存起來,避免重復計算,提升性能。例如,在計算元素的位置或尺寸時,可以將結果存儲在變量中,后續使用時直接讀取。?

  • 事件解綁:在unmounted鉤子函數中,要記得解綁在mounted鉤子中添加的事件監聽器,防止內存泄漏。比如在上述懶加載指令中,使用IntersectionObserver觀察元素時,在元素不再需要觀察時,調用unobserve方法解除觀察。?

  • 指令參數類型檢查:在指令的鉤子函數中,要對傳入的參數進行嚴格的類型檢查和合法性驗證,避免因參數錯誤導致的異常。例如,在權限指令中,確保binding.value是一個數組類型,并且數組元素是字符串類型。?

  • 指令命名規范:自定義指令的命名要遵循一定的規范,建議采用v-前綴加上有意義的名稱,方便團隊成員理解和使用。同時,命名要避免與 Vue 自帶的指令或項目中已有的指令沖突。?


本次分享就到這兒啦,我是鵬多多,如果您看了覺得有幫助,歡迎評論,關注,點贊,轉發,我們下次見~

往期文章

  • vue中ref的詳解以及react的ref對比
  • css使用aspect-ratio制作4:3和9:16和1:1等等比例布局
  • Web前端頁面開發阿拉伯語種適配指南
  • flutter-使用extended_image操作圖片的加載和狀態處理以及緩存和下載
  • flutter-制作可縮放底部彈出抽屜評論區效果
  • flutter-實現Tabs吸頂的PageView效果
  • Vue2全家桶+Element搭建的PC端在線音樂網站
  • 助你上手Vue3全家桶之Vue3教程
  • 超詳細!vue組件通信的10種方式
  • 超詳細!Vuex手把手教程
  • 使用nvm管理node.js版本以及更換npm淘寶鏡像源
  • vue中利用.env文件存儲全局環境變量,以及配置vue啟動和打包命令

個人主頁

  • CSDN
  • GitHub
  • 掘金

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

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

相關文章

Elasticsearch 索引文檔的流程

Elasticsearch 索引文檔的流程是一個分布式、多階段的過程&#xff0c;涉及客戶端請求、路由、主副本同步及持久化等步驟&#xff0c;具體流程如下&#xff1a; 一、客戶端請求與路由 1.1 文檔接收與路由計算? 客戶端通過 REST API 發送文檔寫入請求&#xff0c;需指…

【unity】批量剔除圖片四周空白像素的工具

摘要&#xff1a;Unity圖片空白像素批量處理工具 該工具提供兩種方式批量剔除圖片空白像素&#xff1a; 靜態處理類&#xff1a;提供TrimTexture方法&#xff0c;可讀取紋理像素數據&#xff0c;計算非透明區域邊界&#xff0c;生成裁剪后的新紋理&#xff1b;SaveTexture方法…

可編輯64頁PPT | 基于DeepSeek的數據治理方案

薦言摘要&#xff1a;在數據量爆炸式增長且業務需求日益復雜的當下&#xff0c;企業數據治理面臨著數據分散、標準混亂、價值挖掘難等諸多挑戰。我們基于DeepSeek強大的智能能力&#xff0c;為企業量身打造創新數據治理方案。 DeepSeek憑借其卓越的自然語言處理和深度學習技術…

啟用AWS VPC流日志保存到CloudWatch日志組

目標 啟用VPC流日志 啟用流日志 選擇vpc&#xff0c;開始啟用流日志&#xff0c;如下圖&#xff1a; 設置名稱和日志組&#xff0c;創建流日志&#xff0c;如下圖&#xff1a; 參考 AWS云中的VPC啟用流日志保存S3&#xff08;AWS中國云&#xff09;創建發布到 CloudWatc…

游戲引擎學習路徑與技術棧指南

游戲引擎架構全景圖&#xff08;基于GAMES104 V2.2思維導圖&#xff09; graph TDA[基礎架構] --> A1[面向數據管理]A --> A2[任務系統]A1 --> A11[ECS架構]A1 --> A12[內存優化]A2 --> A21[Job System]A2 --> A22[依賴調度]B[工具鏈] --> B1[編輯器框架]…

預訓練大語言模型

Encoder-only model&#xff08;Autoencoding model&#xff09; 使用掩碼語言模型&#xff08;Masked Language Modeling, MLM&#xff09;進行預訓練輸入原始語句和掩碼&#xff0c;訓練目標是預測掩碼標記&#xff0c;一遍重建原始句子->也稱為降噪目標&#xff08;deno…

C++信奧賽闖關題目1

1閏年 輸入一個年份,輸出它是否為閏年 閏年的規則: 描述:能被4整除,并且不能被100整除的,再加上可以被400整除的 版本一:原始版 #include <iostream> #include <cmath> using namespace std; int main() {int y;cin>>y;bool x = y%4==0&&y…

Qt+OPC開發筆記(三):OPC客戶端訂閱特點消息的Demo

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/148868209 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV…

嵌入式開發學習日志Day8(ARM體系架構——按鍵、蜂鳴器及中斷)

一、蜂鳴器學習 代碼實現&#xff1a; 二、BSP工程管理及Makefile 1、BSP工程管理 利用BSP工程管理&#xff0c;使文檔顯示不雜亂&#xff1b; 將這些文件分為4類&#xff0c;并保存到4個不同的文件夾里。 首先在新的工程文件夾里創建一個之后我們編寫的類似led驅動&#xff0…

Linux部署Sonic前后端(詳細版)(騰訊云)

系統用的是Ubuntu 22.04 LTS 1、安裝Docker sudo apt update sudo apt install -y docker.io docker-compose sudo systemctl start docker sudo systemctl enable docker# 如果不想每次用 sudo&#xff0c;可以加權限 sudo usermod -aG docker $USER 2、安裝 docker-compose…

騰訊云CBS:企業級云存儲的性能與可靠性重構

摘要 根據Forrester 2025年網絡分析與可見性&#xff08;NAV&#xff09;報告&#xff0c;東西向流量安全與加密威脅檢測成為企業核心痛點&#xff08;誤報率降低需求↑40%&#xff09;。騰訊云CBS作為底層存儲支柱&#xff0c;通過三副本跨可用區冗余架構與毫秒級故障切換能力…

ubuntu 22.04 更換阿里源 (wsl2 參照)

步驟 1: 備份當前源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 步驟 2: 編輯源列表文件 sudo nano /etc/apt/sources.list 步驟 3: 添加阿里云鏡像源 ubuntu 阿里源地址可以在這查看 ubuntu鏡像_ubuntu下載地址_ubuntu安裝教程-阿里巴巴開源鏡像站 …

idea中push拒絕,merge,rebase的區別

在 IntelliJ IDEA 中進行 Git 操作時&#xff0c;Push 拒絕&#xff08;Push Rejected&#xff09;、Merge 和 Rebase 是常見的沖突解決方式。它們有不同的適用場景和影響&#xff0c;下面詳細說明它們的區別&#xff0c;并附上流程圖幫助理解。 1. Push 拒絕&#xff08;Push …

輕松實現PDF局部擦除的技術級解決方案

在處理PDF文檔時&#xff0c;我們常常會遇到這樣的場景&#xff1a;想要刪除某段文字、擦除一張圖片&#xff0c;或者對頁面內容進行局部調整。但很多編輯工具要么操作繁瑣&#xff0c;要么功能受限&#xff0c;甚至還需要付費解鎖核心功能。 這是一款輕便又實用的PDF編輯工具…

css color 十六進制顏色透明度

css color 十六進制顏色透明度 例&#xff1a;#FFFFFF ~~ #FFFFFF1A(10% ) 0% 為 FF10% 為 1A20% 為 3330% 為 4D40% 為 6650% 為 8060% 為 9970% 為 B380% 為 CC90% 為 E6100% 為 00

Git簡介和常用命令

Git簡介 Git是一款版本管理軟件&#xff0c;可以在任何時間點保存文件&#xff0c;也能夠恢復到以前任意時間點保存的文檔&#xff0c;Git作用簡單舉例來說就是&#xff0c;寫論文&#xff0c;有很多個版本&#xff0c;將原來的論文保存起來&#xff0c;新建一個副本&#xff…

Kafka 性能調優指南

文章目錄 概述操作系統層面調優文件系統優化內存管理磁盤 I/O 優化 JVM 調優堆內存設置GC 收集器選擇常見 GC 問題 Broker 端調優版本兼容性關鍵參數配置日志段大小調優設置原則推薦配置調優考慮因素監控命令 應用層調優客戶端復用資源管理多線程消費模式 性能指標調優吞吐量優…

佰力博科技與您探討低溫真空探針臺如何保養

低溫真空探針臺是一種用于在低溫或真空環境下進行電學性能測試的精密儀器&#xff0c;其保養和維護對于確保設備的穩定運行和延長使用壽命至關重要。 一、日常清潔與檢查 1、使用后應立即清潔探針臺&#xff0c;尤其是探針、接口和連接器&#xff0c;避免灰塵和雜質影響精度。…

MySQL:深入總結鎖機制

寫在前面 在 MySQL 數據庫中&#xff0c;鎖機制是保障并發控制和數據一致性的關鍵。合理運用鎖機制&#xff0c;能有效避免數據競爭&#xff0c;提升數據庫性能。接下來&#xff0c;我們就深入了解 MySQL 中的各類鎖。 博主總結&#xff08;注&#xff1a;針對總結的詳解補充在…

AI+OT安全,讓威脅情報實現主動防御

當前&#xff0c;網絡犯罪組織的運作模式正日趨“企業化”&#xff0c;給全球網絡安全帶來了嚴峻挑戰。企業以及各類組織機構有必要采用威脅情報驅動的防御體系&#xff08;Threat-Informed Defense, TID&#xff09;&#xff0c;將安全運營模式從被動響應徹底轉向基于威脅情報…