Vue內置指令與自定義指令

一、前言

在 Vue 開發中,指令(Directives) 是一種非常強大的特性,它允許我們以聲明式的方式操作 DOM。Vue 提供了一些常用的內置指令,如 v-ifv-showv-bindv-on 等,同時也支持開發者根據需求創建自己的自定義指令

本文將帶你全面了解 Vue 中的指令系統,包括:

  • 常用內置指令的使用
  • 自定義指令的定義與注冊
  • 指令的生命周期鉤子函數
  • 實際應用場景與案例分析

二、Vue 內置指令介紹

1. 條件渲染指令

  • v-if:根據表達式的真假決定是否渲染元素。
  • v-else?/?v-else-if:配合?v-if?使用,實現多條件判斷。
  • v-show:通過 CSS 的?display?屬性控制元素顯示/隱藏。
<h1 v-if="isLoggedIn">歡迎回來!</h1>
<h1 v-else>請先登錄。</h1>

2. 列表渲染指令

  • v-for:用于循環渲染列表數據。
<ul><li v-for="(item, index) in items" :key="index">{{ item }}</li>
</ul>

3. 數據綁定指令

  • v-bind:動態綁定屬性值,常用縮寫為?:attr="value"
<img :src="imageUrl" alt="圖片">
<a :href="linkUrl">點擊我</a>
  • v-model:實現表單控件與組件狀態的雙向綁定。
<input type="text" v-model="username">
<p>你輸入的用戶名是:{{ username }}</p>

4. 事件綁定指令

  • v-on:監聽 DOM 事件并執行對應的方法,常用縮寫為?@event="handler"
<button @click="submitForm">提交</button>
<input @keyup.enter="search" placeholder="按回車搜索">

5. 其他常用指令

  • v-text:更新元素的文本內容,會覆蓋已有內容。
  • v-html:插入 HTML 字符串(注意 XSS 風險)。
  • v-pre:跳過編譯過程,直接顯示原始內容。
  • v-once:只渲染一次,后續不再更新。

三、自定義指令的使用

雖然 Vue 提供了很多實用的內置指令,但有時我們需要一些特定功能來操作 DOM 或增強組件行為,這時就可以使用自定義指令

1. 定義一個自定義指令

Vue 2.x 示例:
// main.js
Vue.directive('highlight', {bind(el, binding, vnode) {el.style.backgroundColor = binding.value;}
});
Vue 3 Composition API 示例:
// main.js
const app = createApp(App)app.directive('highlight', {beforeMount(el, binding) {el.style.backgroundColor = binding.value;}
})app.mount('#app')

2. 在模板中使用

<p v-highlight="'yellow'">這段文字會被高亮顯示</p>

3. 指令的參數說明

每個指令都有一個回調對象,包含以下屬性:

屬性名描述
el當前綁定的 DOM 元素
binding包含指令的所有信息的對象,如?value,?oldValue,?arg,?modifiers?等
vnode虛擬節點
prevNode之前的虛擬節點(Vue 3)

四、指令的生命周期鉤子函數(Vue 3)

在 Vue 3 中,自定義指令有如下可用的鉤子函數:

鉤子函數觸發時機
beforeMount指令第一次綁定到元素時調用(之前叫?bind
mounted元素被插入到父節點時調用(之前叫?inserted
beforeUpdate所在組件即將更新時調用(之前叫?update
updated所在組件更新后調用(之前叫?componentUpdated
beforeUnmount元素即將解綁時調用(之前叫?unbind
unmounted元素已解綁時調用

五、實戰應用:創建幾個實用的自定義指令

? 指令一:自動聚焦指令?v-focus

適用于頁面加載或彈窗打開時自動聚焦某個輸入框。

app.directive('focus', {mounted(el) {el.focus()}
})

使用:

<input v-focus placeholder="自動獲取焦點">

? 指令二:權限控制指令?v-permission

可用于根據用戶角色控制某些按鈕或菜單的顯示。

app.directive('permission', {mounted(el, binding) {const userRoles = ['admin', 'editor'];if (!userRoles.includes(binding.value)) {el.parentNode.removeChild(el); // 移除無權限的元素}}
})

使用:

<button v-permission="'admin'">管理員操作</button>

? 指令三:節流防抖指令?v-throttle?/?v-debounce

防止高頻觸發事件(如滾動、輸入等),提升性能。

app.directive('throttle', {mounted(el, binding) {let timer = null;el.addEventListener('scroll', () => {if (!timer) {binding.value(); // 執行傳入的方法timer = setTimeout(() => timer = null, 300);}});}
});

使用:

<div v-throttle="onScroll">滾動區域</div>

六、最佳實踐與注意事項

場景推薦做法
不要濫用指令優先使用組件化、響應式數據處理邏輯
盡量避免直接操作 DOMVue 的核心思想是數據驅動視圖
指令應保持輕量復雜邏輯建議封裝成方法或組件
注意內存泄漏在 unmounted 鉤子中清理定時器、事件監聽等資源
Vue 3 中替代過濾器可結合指令 + 方法進行格式化輸出

七、結語

感謝您的閱讀!如果你有任何疑問或想要分享的經驗,請在評論區留言交流!

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

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

相關文章

華為AP6050DN無線接入點瘦模式轉胖模式

引言 華為AP6050DN是一款企業級商用的無線接入點。由于產品定位原因,其默認工作在瘦模式下,即須經AC統一控制和管理,是不能直接充當普通的無線路由器來使用的。 而本文的目的,就是讓其能脫離AC的統一控制和管理,當作普通無線路由器來使用。 硬件準備 華為AP6050DN無線接…

程序員出海之英語-使用手冊

為什么現在實時翻譯工具這么牛逼了&#xff0c;AI轉譯這么準確了&#xff0c;我還在這里跟老古董一樣吭哧吭哧學英語呢&#xff1f; 這是因為我們始終是和人打交道&#xff0c;不僅僅是為了考試&#xff0c;看懂官方文章&#xff0c;聽懂官方視頻。這里為什么說官方&#xff0c…

Java 事務管理:在分布式系統中實現可靠的數據一致性

Java 事務管理&#xff1a;在分布式系統中實現可靠的數據一致性 在當今的軟件開發領域&#xff0c;分布式系統逐漸成為主流架構。然而&#xff0c;這也給事務管理帶來了巨大的挑戰。本文將深入探討 Java 事務管理在分布式系統中的關鍵要點&#xff0c;并通過詳細代碼實例展示如…

微信小程序關于截圖、錄屏攔截

1.安卓 安卓&#xff1a; 在需要禁止的頁面添加 onShow() {if (wx.setVisualEffectOnCapture) {wx.setVisualEffectOnCapture({visualEffect: hidden,complete: function(res) {}})}},// 頁面隱藏和銷毀時需要釋放防截屏錄屏設置onHide() {if (wx.setVisualEffectOnCapture) {w…

使用 PySpark 從 Kafka 讀取數據流并處理為表

使用 PySpark 從 Kafka 讀取數據流并處理為表 下面是一個完整的指南&#xff0c;展示如何通過 PySpark 從 Kafka 消費數據流&#xff0c;并將其處理為可以執行 SQL 查詢的表。 1. 環境準備 確保已安裝: Apache Spark (包含Spark SQL和Spark Streaming)KafkaPySpark對應的Ka…

第十天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 哈哈&#xff0c;十天缺了兩天&#xff0c;我寫的文章現在質量不高&#xff0c;所以我可能考慮&#xff0c;應該一星期或者三四天出點高質量的文章&#xff0c;同時很開心大家能夠學到知識&a…

mediapipe標注視頻姿態關鍵點(基礎版加進階版)

前言 手語視頻流的識別有兩種大的分類&#xff0c;一種是直接將視頻輸入進網絡&#xff0c;一種是識別了關鍵點之后再進入網絡。所以這篇文章我就要來講講如何用mediapipe對手語視頻進行關鍵點標注。 代碼 需要直接使用代碼的&#xff0c;我就放這里了。環境自己配置一下吧&…

Redis數據遷移方案及持久化機制詳解

#作者&#xff1a;任少近 文章目錄 前言Redis的持久化機制RDBAOF Redis save和bgsave的區別redis數據遷移redis單機-單機數據遷移redis 主從-主從數據遷移redis 單機-cluster數據遷移redis cluster –redis cluster數據遷移 前言 Redis數據遷移是常見需求&#xff0c;主要包括…

圖論回溯

圖論 200.島嶼數量DFS 給你一個由 ‘1’&#xff08;陸地&#xff09;和 ‘0’&#xff08;水&#xff09;組成的的二維網格&#xff0c;請你計算網格中島嶼的數量。島嶼總是被水包圍&#xff0c;并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。此外&#xff…

真實網絡項目中交換機常用的配置與解析

一、配置三層鏈路聚合增加鏈路帶寬 1.組網需求 某企業有多個部門分布在不同的地區&#xff0c;由于業務發展的需要&#xff0c;不同區域的部門與部門之間有進行帶有VLAN Tag的報文的傳輸需求。采用透明網橋的遠程橋接和QinQ功能&#xff0c;可以實現企業在不同區域部門之間進…

【Redis】過期鍵刪除策略,LRU和LFU在redis中的實現,緩存與數據庫雙寫一致性問題,go案例

一、Redis 中的過期鍵刪除策略有哪些&#xff1f; 采用了 惰性刪除 和 定期刪除 兩種策略處理過期鍵&#xff1a; 1. 惰性刪除&#xff08;Lazy Deletion&#xff09; 機制&#xff1a;只有在訪問 key 時才檢查是否過期&#xff0c;如果已過期則立刻刪除。優點&#xff1a;對…

為什么單張表索引數量建議控制在 6 個以內

單張表索引數量建議控制在6個以內的主要原因包括以下幾點?&#xff1a; ?性能影響?&#xff1a;索引會占用額外的磁盤空間。如果索引數量過多&#xff0c;會占用大量的磁盤空間&#xff0c;尤其是在數據量較大的情況下&#xff0c;索引占用的空間可能會超過數據本身。此外&…

深度學習實戰109-智能醫療隨訪與健康管理系統:基于Qwen3(32B)、LangChain框架、MCP協議和RAG技術研發

大家好,我是微學AI,今天給大家介紹一下深度學習實戰109-智能醫療隨訪與健康管理系統:基于Qwen3(32B)、LangChain框架、MCP協議和RAG技術研發。在當今醫療信息化快速發展的背景下,醫療隨訪與健康管理面臨著數據分散、信息整合困難、個性化方案生成效率低等挑戰。傳統的醫療隨…

聊一聊 .NET Dump 中的 Linux信號機制

一&#xff1a;背景 1. 講故事 當 .NET程序 在Linux上崩潰時&#xff0c;我們可以配置一些參考拿到對應程序的core文件&#xff0c;拿到core文件后用windbg打開&#xff0c;往往會看到這樣的一句信息 Signal SIGABRT code SI_USER (Sent by kill, sigsend, raise)&#xff0c…

如何在uniapp H5中實現路由守衛

目錄 Vue3 app.config.globalProperties 1. 創建 Vue 應用實例 2. 添加全局屬性或方法 3. 在組件中使用全局屬性或方法 beforeEach在uniapp的注冊 1、在H5中這兩個對象是都存在的。「router:route」但是功能并不全面,具體可參考下圖。 2、剛剛測試了一下,在微信小程序…

無人機降落傘設計要點難點及原理!

一、設計要點 1. 傘體結構與折疊方式 傘體需采用輕量化且高強度的材料&#xff08;如抗撕裂尼龍或芳綸纖維&#xff09;&#xff0c;并通過多重折疊設計&#xff08;如三重折疊縫合&#xff09;減少展開時的阻力&#xff0c;同時增強局部承力區域的強度。 傘衣的幾何參數&am…

AI時代新詞-AI增強現實(AI - Enhanced Reality)

一、什么是AI增強現實&#xff08;AI - Enhanced Reality&#xff09;&#xff1f; AI增強現實&#xff08;AI - Enhanced Reality&#xff09;是指將人工智能&#xff08;AI&#xff09;技術與增強現實&#xff08;Augmented Reality&#xff0c;簡稱AR&#xff09;技術相結合…

基于Matlab實現各種光譜數據預處理

在IT領域&#xff0c;尤其是在數據分析和科學研究中&#xff0c;光譜數據的預處理是至關重要的步驟。光譜數據通常包含了豐富的信息&#xff0c;但往往受到噪聲、雜散光、背景信號等因素的影響&#xff0c;需要通過預處理來提取有效信號&#xff0c;提高分析的準確性和可靠性。…

用 commitizen-go 來實現標準化你的Git提交信息 【windows 版】

前言 團隊中有部分人的 commit 信息比較隨意&#xff0c;因此想用工具來進行約束&#xff0c; web 項目可以使用 commitizen 來實現&#xff0c; 但是 golang 又該用什么來約束呢&#xff0c; 在 Github 上找到 commitizen-go 可以做為 commitizen 平替&#xff0c;但該說明文…

為什么共現矩陣是高維稀疏的

為什么共現矩陣是高維稀疏的&#xff1f; 共現矩陣&#xff08;Co-occurrence Matrix&#xff09;的高維稀疏性是其固有特性&#xff0c;主要由以下原因導致&#xff1a; 1. 高維性的根本原因 詞匯表大小決定維度&#xff1a; 共現矩陣的維度為 ( V \times V )&#xff0c;其…