【Vue #3】指令補充樣式綁定

一、指令修飾符

Vue 的指令修飾符(Directive Modifiers)是 Vue 模板語法中的重要特性,它們以半角句號 . 開頭,用于對指令的綁定行為進行特殊處理

修飾符作用如下:

  1. 簡化事件處理(如阻止默認行為、停止冒泡)
  2. 精準控制輸入(如自動格式化表單值)
  3. 優化性能(如延遲數據同步)
  4. 增強交互(如精確控制按鍵觸發)
類型常用修飾符
事件.stop .prevent .capture .self .once .passive
鍵盤.enter .tab .esc .space .up .down .left .right .ctrl .alt .shift .meta
鼠標.left .right .middle
表單.lazy .number .trim
系統修飾鍵.exact

1. 事件修飾符(Event Modifiers)

用于 v-on 指令(簡寫為 @),處理 DOM 事件:

  • .stop:阻止事件冒泡
  • .prevent:阻止默認行為(比如:點擊表單提交,表單不會刷新頁面)
  • .capture:使用捕獲模式(父級先觸發)
  • .self:僅當事件源是當前元素時觸發(子元素點擊就不會觸發)
  • .once:事件只觸發一次
  • .passive:提升滾動性能(常用于移動端)

注意:修飾符可串聯

<a @click.stop.prevent="doSomething">同時阻止冒泡和默認行為</a>

代碼示例如下:

<script setup>
import { ref } from 'vue'
const onPClick = () => {console.log('onPClick')
}
const onDivClick = () => {console.log('onDivClick')
}
</script>
<template><div @click="onDivClick"><a href="https://www.baidu.com/">百度一下</a><p></p><!-- .prevent: 阻止默認行為 --><a href="https://www.baidu.com/" @click.prevent>百度一下</a><!-- .stop: 阻止冒泡, 同名事件不會向上傳遞 --><p @click.stop="onPClick">I miss You</p><!-- 修飾符的鏈式調用: 表名兩個同時阻止 --><a href="https://www.baidu.com/" @click.stop.prevent>百度一下</a></div>
</template>

2. 按鍵修飾符(Key Modifiers)

用于 v-on:keyupv-on:keydown,監聽特定按鍵:

① 按鍵別名

<input @keyup.enter="submit"> 回車鍵觸發
<input @keyup.esc="close"> ESC 鍵觸發
<input @keyup.delete="deleteItem"> 刪除鍵觸發

② 系統修飾鍵

<input @keyup.ctrl.enter="ctrlEnter"> Ctrl + Enter
<div @click.ctrl.exact="ctrlOnlyClick">僅按 Ctrl 時點擊觸發</div>

3. 鼠標修飾符(Mouse Modifiers)

控制鼠標按鈕觸發事件:

  • .left:左鍵點擊
  • .right:右鍵點擊
  • .middle:中鍵點擊
<button @click.right="showContextMenu">右鍵觸發菜單</button>

4. 表單修飾符(Key Modifiers)

用于 v-model 指令,優化表單處理:

  • .lazy:失去焦點時同步數據,而不是輸入時同步數據。將 input 事件改為 change 事件后同步
  • .number:自動將輸入轉為數字類型(parseFloat() 轉數字)
  • trim:自動去除首尾空格
<script setup>
import { reactive } from 'vue'
const goods = reactive({name: '', price: ''
})
</script>
<template><!-- .lazy -->名稱: <input type="text" v-model.lazy="goods.name" /> <br /> <br /><!-- .trim -->名稱: <input type="text" v-model.trim="goods.name" /> <br /> <br /><!-- .number -->價格: <input type="text" v-model.number="goods.price" /> <br /> <br /></template>

5. 自定義修飾符

在自定義指令中定義自己的修飾符:

<script setup>
const vColor = {mounted(el, binding) {// 1. 處理參數(用于背景色)if (binding.arg) {el.style.backgroundColor = binding.arg}// 2. 處理修飾符(可擴展多個樣式)if (binding.modifiers.bold) {el.style.fontWeight = 'bold'}if (binding.modifiers.italic) {el.style.fontStyle = 'italic'}if (binding.modifiers.underline) {el.style.textDecoration = 'underline'}// 3. 處理值(用于文字顏色)if (binding.value) {el.style.color = binding.value}// 4. 添加默認內邊距提升顯示效果el.style.padding = '0.5rem'el.style.borderRadius = '4px'}
}// 注冊局部指令
const directives = { vColor }
</script><template><!-- 改進后的使用示例 --><p v-color:skyblue.bold.italic="'#333'">天藍背景、加粗斜體、深灰文字</p><p v-color:#ffd700.underline="'#2c3e50'">金色背景、下劃線、深藍文字</p>
</template>

代碼解析

  1. 參數處理 (:skyblue)
    • 通過 binding.arg 獲取指令參數
    • 直接作為背景顏色使用(支持顏色名稱、十六進制、RGB等格式)
    • 示例中 :skyblue 會設置 background-color: skyblue
  2. 修飾符處理 (.bold.italic)
    • 通過 binding.modifiers 對象檢查修飾符
    • 支持多個修飾符組合使用:
      • .boldfont-weight: bold
      • .italicfont-style: italic
      • .underlinetext-decoration: underline
  3. 值處理 (="'#333'")
    • 通過 binding.value 獲取指令值
    • 用于設置文字顏色
    • 注意在模板中需要使用引號包裹字符串值

修飾符機制說明

  • Vue 會自動解析指令后的點號標識符為修飾符
  • 例如 v-color.bold.italic 會生成:
binding.modifiers = { bold: true,italic: true 
}

6. 修飾符最佳實踐

① 鏈式順序影響結果

<!-- 先阻止冒泡,再阻止默認行為 -->
<a @click.stop.prevent></a><!-- 先阻止默認行為,再判斷是否自身觸發 -->
<a @click.prevent.self></a>

合理使用系統修飾鍵
.exact 精確控制組合按鍵:

<input @keyup.ctrl.exact="onlyCtrl"> 僅按 Ctrl 時觸發

③ 版本兼容性

  • Vue 3 默認啟用 passive 提升滾動性能
  • Vue 3 廢棄了 Vue 2 的按鍵碼(如 .13

二、v-model 用在其他表單元素

常見的表單元素都可以用 v-model綁定關聯,作用是可以快速 獲取 或 設置 表單元素的值

它會根據 控件類型 自動選取 正確的屬性 來更新元素

  • 輸入框 input:text ——> value

  • 文本域 textarea ——> value

  • 下拉菜單 select ——> value

    • v-model 寫在select上,關聯是選中option的 value
  • 單選框 input:radio ——> value

    • 給單選框添加value屬性,v-model 收集選中單選框的value
  • 復選框 input:checkbox ——> checked / value

    • 一個復選框:v-model 綁定 布爾值,關聯 checked 屬性
    • 一組復選框:v-model 綁定 數組,關聯 value 屬性,給復選框 手動添加 value
<script setup>
import { ref } from 'vue'
const intro = ref('') // 介紹
const city = ref('SH') // 城市
const blood = ref('ab') // 血型
const isAgree = ref(false) // 同意協議
const hobby = ref(['ZQ', 'PB']) // 愛好
</script>
<template><!-- 1. 文本域 --><textarea v-model="intro" cols="30" rows="4" placeholder="請輸入自我介紹"></textarea> <br /><br /><!-- 2. 下拉菜單 --><select v-model="city"><option value="BJ">北京</option><option value="CS">長沙</option><option value="SH">上海</option></select><br /> <br /><!-- 3. 單選框: 多個當中只能選一個 --><input type="radio" value="a" v-model="blood" />A<input type="radio" value="b" v-model="blood" />B<input type="radio" value="ab" v-model="blood" />AB<br /><br /><!-- 4. 復選框  --><input type="checkbox" v-model="isAgree" />是否同意用戶協議<br /><br /><input v-model="hobby" type="checkbox" value="LQ" />籃球<input v-model="hobby" type="checkbox" value="ZQ" />足球<input v-model="hobby" type="checkbox" value="PB" />跑步
</template>

三、樣式綁定

🐇 為了方便開發者進行樣式控制,Vue 擴展了 v-bind 的語法,可以針對 class 類名 和 style 行內樣式兩個屬性進行控制,進而通過數據控制元素的樣式

1. Class 類名綁定

用于動態添加或移除 CSS 類名,支持多種語法格式。

:class = "三元表達式/對象"
1.1 對象語法

通過對象動態切換類名(鍵為類名,值為布爾值)

當class動態綁定的是對象時,鍵就是類名,值就是布爾值,如果值是true,就添加這個類,否則刪除這個類

<p class="box":class="{ 類名1:布爾值1,類名2:布爾值2 }"></p>
1.2 數組語法

應用多個類名(可混合靜態和動態類):

<div :class="[類名1, 類名2, {條件}]"></div>
1.3 三元表達式

語法如下:

<p :class="條件 ? '類名1' : '類名2'"></p>
1.4 與靜態 class 共存

靜態class與動態class共存可以共存,二者會合并

<p class="item" :class="條件 ?'類名1':'類名2'"></p〉

代碼示例如下:

<script setup>
import { ref } from 'vue'const isActive = ref(true)
const errorClass = ref('text-danger')  // 新增數組綁定用的類名
const fontSize = ref(20)              // 內聯樣式用字體大小
</script><template><!-- 1. 對象綁定 --><p :class="{ active: isActive }">Active1</p><!-- 2. 數組綁定 --><p :class="['base-class', errorClass, { active: isActive }]">Active3</p><!-- 3. 三元綁定 --><p :class="isActive ? 'active' : ''">Active2</p><!-- 4. 動靜態 class --><p class="base-class" :class="{ active: isActive }">Active4</p><style>
.active {color: red;
}
.text-danger {text-decoration: line-through;
}
.base-class {font-size: 20px;
}
</style>

2. 內聯樣式綁定

通過 :style 動態設置行內樣式,支持對象或數組語法

基本語法如下:

:style="{屬性名1: 表達式1, 屬性名2: 表達式2, ...}"
2.1 對象語法

直接綁定樣式對象(推薦駝峰式寫法):

<div style="color: red; font-size: 20px;"></div>
2.2 數組語法

合并多個樣式對象

<template><div :style="[baseStyles, overridingStyles]">1234</div>
</template><script>
// 可選:在 script 中定義樣式對象
export default {data() {return {baseStyles: { color: 'blue' },overridingStyles: { fontSize: '30px' }}}
}
</script>
2.3 自動前綴

Vue 會自動為需要瀏覽器前綴的 CSS 屬性添加前綴(如 transform

代碼示例如下

<script setup>
import { ref, reactive } from 'vue'const isActive = ref(true)
const errorClass = ref('text-danger')  // 新增數組綁定用的類名
const fontSize = ref(20)              // 內聯樣式用字體大小// 字體顏色
const colorStr = ref('red')// 響應式樣式對象
const styleObj = reactive({color: 'green',background: 'yellow'
})
</script><template><!-- 1. 內聯樣式綁定 --><div :style="{color: isActive ? 'red' : 'gray',fontSize: fontSize + 'px','font-weight': 'bold'}">內聯樣式示例</div><div><p :style="{ color: colorStr }">Style1</p><p :style="styleObj">Style2</p></div><!-- 3. 樣式對象綁定(另一種寫法) --><div :style="styleObject">樣式對象</div>
</template><script>
// 可選:在 script 中定義樣式對象
export default {data() {return {styleObject: {backgroundColor: 'yellow',padding: '10px'}}}
}
</script>

3. 最佳實踐

1. 使用計算屬性優化

當樣式邏輯復雜時,用計算屬性返回樣式對象

2. 綁定組件子元素的樣式

在組件上使用 :class 時,類名會添加到組件的根元素(需組件設計支持)

3. CSS Modules 集成

在單文件組件中,通過 $style 使用模塊化 CSS

<template><div :class="$style.myClass">模塊化樣式</div>
</template><style module>
.myClass { color: red; }
</style>

4. 常見應用場景

  1. 狀態反饋:表單驗證錯誤時高亮輸入框
  2. 主題切換:動態切換暗黑模式/明亮模式
  3. 動畫控制:通過類名觸發 CSS 動畫
  4. 響應式布局:根據屏幕尺寸調整樣式

5. 注意事項

  1. CSS 優先級:style 的樣式優先級高于外部 CSS
  2. 性能優化:避免頻繁修改大量樣式(建議用 CSS 類替代)
  3. 兼容性:某些 CSS 屬性需注意瀏覽器兼容性(如 position: sticky

在這里插入圖片描述

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

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

相關文章

Reinforcement Learning強化學習--李宏毅機器學習筆記

個人學習筆記&#xff0c;如有錯誤歡迎指正&#xff0c;也歡迎交流&#xff0c;其他筆記見個人空間 強化學習 vs 監督學習 監督學習&#xff08;Supervised Learning&#xff09;&#xff1a;你有輸入和明確的輸出標簽&#xff0c;例如圖像分類。 強化學習&#xff08;Rein…

Windows VsCode Terminal窗口使用Linux命令

背景描述&#xff1a; 平時開發環境以Linux系統為主&#xff0c;有時又需要使用Windows系統下開發環境&#xff0c;為了能像Linux系統那樣用Windows VsCode&#xff0c;Terminal命令行是必不可少內容。 注&#xff1a;Windows11 VsCode 1.99.2 下面介紹&#xff0c;如何在V…

軟件測試之測試數據生成(Excel版)

這是Excel生成測試數據的函數使用 1.時間 1.1.時間 例生成2022-05-01之前一年內任意時間點: =TEXT("2022-05-01"-RAND()-RANDBETWEEN(1,365),"yyyy-mm-dd hh:mm:ss")1.2.年月日 yyyy-mm-dd 以當前時間生成10年的日期 =TEXT(NOW()-RAND()-RANDBETWE…

libwebsocket建立服務器需要編寫LWS_CALLBACK_ADD_HEADERS事件處理

最近在使用libwebsocket&#xff0c;感覺它搭建Http與websocket服務器比較簡單&#xff0c;不像poco庫那么龐大&#xff0c;但當我使用它建立websocket服務器后&#xff0c;發現websocket客戶端連接一直沒有連接成功&#xff0c;不知道什么原因&#xff0c;經過一天的調試&…

從 PyTorch 到 ONNX:深度學習模型導出全解析

在模型訓練完畢后&#xff0c;我們通常希望將其部署到推理平臺中&#xff0c;比如 TensorRT、ONNX Runtime 或移動端框架。而 ONNX&#xff08;Open Neural Network Exchange&#xff09;正是 PyTorch 與這些平臺之間的橋梁。 本文將以一個圖像去噪模型 SimpleDenoiser 為例&a…

Hadoop集群部署教程-P6

Hadoop集群部署教程-P6 Hadoop集群部署教程&#xff08;續&#xff09; 第二十一章&#xff1a;監控與告警系統集成 21.1 Prometheus監控體系搭建 Exporter部署&#xff1a; # 部署HDFS Exporter wget https://github.com/prometheus/hdfs_exporter/releases/download/v1.1.…

【Altium】AD-生成PDF文件圖紙包含太多的空白怎么解決

1、 文檔目標 AD設計文件導出PDF時&#xff0c;圖紙模板方向設置問題 2、 問題場景 AD使用Smart PDF導出PDF時&#xff0c;不管你怎么設置頁面尺寸&#xff0c;只要從橫向轉為縱向輸出&#xff0c;輸出的始終是橫向紙張&#xff08;中間保留縱向圖紙&#xff0c;兩邊大量留白…

大廠面試:六大排序

前言 本篇博客集中了冒泡&#xff0c;選擇&#xff0c;二分插入&#xff0c;快排&#xff0c;歸并&#xff0c;堆排&#xff0c;六大排序算法 如果覺得對你有幫助&#xff0c;可以點點關注&#xff0c;點點贊&#xff0c;謝謝你&#xff01; 1.冒泡排序 //冒泡排序&#xff…

大模型開發:源碼分析 Qwen 2.5-VL 視頻抽幀模塊(附加FFmpeg 性能對比測試)

目錄 qwen 視頻理解能力 messages 構建 demo qwen 抽幀代碼分析 驗證兩個實際 case 官網介紹圖 性能對比&#xff1a;ffmpeg 抽幀、decord 庫抽幀 介紹 聯系 對比 測試結果 測試明細 ffmpeg 100 qps 測試&#xff08;CPU&#xff09; decord 100 qps 測試&#x…

git的上傳流程

好久沒使用git 命令上傳遠程倉庫了。。。。。溫習了一遍&#xff1b; 幾個注意點--單個文件大小不能超過100M~~~ 一步步運行下面的命令&#xff1a; 進入要上傳的文件夾內&#xff0c;點擊git bash 最終 hbu的小伙伴~有需要nndl實驗的可以自形下載哦

驅動學習專欄--字符設備驅動篇--2_字符設備注冊與注銷

對于字符設備驅動而言&#xff0c;當驅動模塊加載成功以后需要注冊字符設備&#xff0c;同樣&#xff0c;卸載驅動模 塊的時候也需要注銷掉字符設備。字符設備的注冊和注銷函數原型如下所示 : static inline int register_chrdev(unsigned int major, const char *name, const…

redis 放置序列化的對象,如果修改對象,需要修改版本號嗎?

在 Redis 中存儲序列化對象時,如果修改了對象的類結構(例如增刪字段、修改字段類型或順序),是否需要修改版本號取決于序列化協議的兼容性策略和業務場景的容錯需求。以下是詳細分析: 1. 為什么需要考慮版本號? 序列化兼容性問題: 當對象的類結構發生變化時,舊版本的序列…

WPF ObjectDataProvider

在 WPF(Windows Presentation Foundation)中,ObjectDataProvider 是一個非常有用的類,用于將非 UI 數據對象(如業務邏輯類或服務類)與 XAML 綁定集成。它允許在 XAML 中直接調用方法、訪問屬性或實例化對象,而無需編寫額外的代碼。以下是關于 ObjectDataProvider 的詳細…

深度學習-損失函數 python opencv源碼(史上最全)

目錄 定義 種類 如何選擇損失函數&#xff1f; 平方&#xff08;均方&#xff09;損失函數&#xff08;Mean Squared Error, MSE&#xff09; 均方根誤差 交叉熵 對數損失 筆記回饋 邏輯回歸中一些注意事項&#xff1a; 定義 損失函數又叫誤差函數、成本函數、代價函數…

poll為什么使用poll_list鏈表結構而不是數組 - 深入內核源碼分析

一&#xff1a;引言 在Linux內核中,poll機制是一個非常重要的I/O多路復用機制。它允許進程監視多個文件描述符,等待其中任何一個進入就緒狀態。poll的內部實現使用了poll_list鏈表結構而不是數組,這個設計選擇背后有其深層的技術考量。本文將從內核源碼層面深入分析這個設計決…

使用 Azure AKS 保護 Kubernetes 部署的綜合指南

企業不斷尋求增強其軟件開發和部署流程的方法。DevOps 一直是這一轉型的基石,彌合了開發與運營之間的差距。然而,隨著安全威脅日益復雜,將安全性集成到 DevOps 流水線(通常稱為 DevSecOps)已變得勢在必行。本指南深入探討了如何使用 Azure Kubernetes 服務 (AKS) 來利用 D…

2025年常見滲透測試面試題-webshell免殺思路(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 webshell免殺思路 PHP免殺原理 webshell免殺測試&#xff1a; webshell免殺繞過方法&#xff1a; 編…

訪問不到服務器上啟動的llamafactory-cli webui

采用SSH端口轉發有效&#xff0c;在Windows上面進行訪問 在服務器上啟動 llamafactory-cli webui 后&#xff0c;訪問方式需根據服務器類型和網絡環境選擇以下方案&#xff1a; 一、本地服務器&#xff08;物理機/虛擬機&#xff09; 1. 直接訪問 若服務器與操作設備處于同一…

基于 LSTM 的多特征序列預測-SHAP可視化!

往期精彩內容&#xff1a; 單步預測-風速預測模型代碼全家桶-CSDN博客 半天入門&#xff01;鋰電池剩余壽命預測&#xff08;Python&#xff09;-CSDN博客 超強預測模型&#xff1a;二次分解-組合預測-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;BiLSTM-Attention預測模型…

C++ 編程指南35 - 為保持ABI穩定,應避免模板接口

一&#xff1a;概述 模板在 C 中是編譯期展開的&#xff0c;不同模板參數會生成不同的代碼&#xff0c;這使得模板類/函數天然不具備 ABI 穩定性。為了保持ABI穩定&#xff0c;接口不要直接用模板&#xff0c;先用普通類打個底&#xff0c;模板只是“外殼”&#xff0c;這樣 AB…