Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Vue #3】指令补充&样式绑定

【Vue #3】指令补充&样式绑定

作者头像
IsLand1314
发布于 2025-04-13 06:57:45
发布于 2025-04-13 06:57:45
10000
代码可运行
举报
文章被收录于专栏:学习之路学习之路
运行总次数:0
代码可运行

一、指令修饰符

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:提升滚动性能(常用于移动端)

注意:修饰符可串联

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<a @click.stop.prevent="doSomething">同时阻止冒泡和默认行为</a>

代码示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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,监听特定按键:

① 按键别名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input @keyup.enter="submit"> 回车键触发
<input @keyup.esc="close"> ESC 键触发
<input @keyup.delete="deleteItem"> 删除键触发

② 系统修饰键

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input @keyup.ctrl.enter="ctrlEnter"> Ctrl + Enter
<div @click.ctrl.exact="ctrlOnlyClick">仅按 Ctrl 时点击触发</div>
3. 鼠标修饰符(Mouse Modifiers)

控制鼠标按钮触发事件:

  • .left:左键点击
  • .right:右键点击
  • .middle:中键点击
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<button @click.right="showContextMenu">右键触发菜单</button>
4. 表单修饰符(Key Modifiers)

用于 v-model 指令,优化表单处理:

  • .lazy:失去焦点时同步数据,而不是输入时同步数据。将 input 事件改为 change 事件后同步
  • .number:自动将输入转为数字类型(parseFloat() 转数字)
  • trim:自动去除首尾空格
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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. 自定义修饰符

在自定义指令中定义自己的修饰符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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 会生成:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
binding.modifiers = { 
  bold: true,
  italic: true 
}
6. 修饰符最佳实践

① 链式顺序影响结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 先阻止冒泡,再阻止默认行为 -->
<a @click.stop.prevent></a>

<!-- 先阻止默认行为,再判断是否自身触发 -->
<a @click.prevent.self></a>

合理使用系统修饰键: 用 .exact 精确控制组合按键:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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 类名,支持多种语法格式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:class = "三元表达式/对象"
1.1 对象语法

通过对象动态切换类名(键为类名,值为布尔值)

当class动态绑定的是对象时,键就是类名,值就是布尔值,如果值是true,就添加这个类,否则删除这个类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p class="box":class="{ 类名1:布尔值1,类名2:布尔值2 }"></p>
1.2 数组语法

应用多个类名(可混合静态和动态类):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div :class="[类名1, 类名2, {条件}]"></div>
1.3 三元表达式

语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p :class="条件 ? '类名1' : '类名2'"></p>
1.4 与静态 class 共存

静态class与动态class共存可以共存,二者会合并

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p class="item" :class="条件 ?'类名1':'类名2'"></p〉

代码示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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 动态设置行内样式,支持对象或数组语法

基本语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:style="{属性名1: 表达式1, 属性名2: 表达式2, ...}"
2.1 对象语法

直接绑定样式对象(推荐驼峰式写法):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div style="color: red; font-size: 20px;"></div>
2.2 数组语法

合并多个样式对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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

代码示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue指令 - 从零开始学Vue2
指令 (Directives) 是带有 v- 前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。 例如:
玖柒的小窝
2021/10/24
2.5K0
Vue指令 - 从零开始学Vue2
Vue03基础语法--Vue组件+样式绑定+修饰符+常用控件+自定义指令+自定义事件
定义语法:new Vue({el:'#d1',components:{组件名:{配置选项}}})
天蝎座的程序媛
2022/11/18
1.3K0
Vue常用指令02-v-on/v-bind/v-model/自定义指令【1小时掌握vue3系列】
Hello,大家好!我是方才,前面已经学习条件渲染和列表渲染的指令,今天我们一口气把剩下的内容搞定。包括监听事件v-on、动态绑定v-bind、双向绑定v-model以及不常用的指令和自定义指令。
方才编程_公众号同名
2024/11/18
2020
Vue常用指令02-v-on/v-bind/v-model/自定义指令【1小时掌握vue3系列】
Vue 01.基础
插值表达式会出现闪烁问题,即在网速慢时会出现{{ msg }},数据加载好后才会显示数据
LittlePanger
2020/04/14
1.6K0
Vue-QuickStarted
概念:指令(Directives)是 Vue 提供的带有 v- 前缀 的 特殊 标签属性。
用户11097514
2024/05/31
1440
Vue-QuickStarted
vue2你该知道的一切(上)
Vue知识点众多,这两章记录一下Vue2.x版本的常规使用方法。如果你是一名使用Vue框架开发的前端工程师,那么这两章的内容会让你对Vue的知识点记得更牢固。
kai666666
2024/07/11
1250
【Vue】day02-Vue基础入门
所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码
陶然同学
2023/10/14
2620
【Vue】day02-Vue基础入门
vue—你必须知道的
不要在实例属性或者回调函数中(例如,vm.$watch('a', newVal => this.myMethod())使用箭头函数。因为箭头函数会绑定父级上下文,所以 this 不会按照预期指向 Vue 实例,然后 this.myMethod 将是未定义。
超然
2018/08/03
2K0
Vue常用系统指令
标签将会被替代为对应数据对象上 msg 属性(msg定义在data对象中)的值。无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新。 插值表达式主要展示Vue对象中data中的数据,合法的数据表达式 1直接写变量 2字符串拼接 3数值运算 4三元表达式 5内置函数
羊羽shine
2019/06/13
6660
vue学习笔记
当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “就地复用” 策略。如果数据项的顺序被改变,Vue将不是移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。
用户6362579
2019/09/29
1.1K0
Vue 在哪些方面做的比 React 更好?
在过去的五年中,我一直是一名 React 工程师。我爱React。我喜欢开发 React 应用程序。我认为它是目前最好的UI框架之一。
童欧巴
2020/12/31
1.9K0
全栈工程师开发实战之从入门到技术实战之02--vue指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6kqd13Tt-1654938578648)(assets/image-20220202161926801.png)]
张哥编程
2024/12/13
1680
全栈工程师开发实战之从入门到技术实战之02--vue指令
2020前端技术面试必备Vue:(一)基础快速学习篇
本章节,我将带领大家一起刷Vue 技术点,来应对接下来的面试,此次会陆续更新Vue全家桶:Vue VueX Vue-Router ;以及后面时间充足的话,来实现一个Vue项目。
程序员海军
2021/10/11
2K0
2020前端技术面试必备Vue:(一)基础快速学习篇
Vue.js学习总结——1
双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html 指令:
说故事的五公子
2019/09/29
6580
Vue.js学习总结——1
Vue基础:数据绑定
注意:当v-bind:style使用需要特定前缀的CSS属性时,如transform,Vue.js会自动侦测并添加相应的前缀。
奋飛
2019/08/15
1.2K0
vue指令和用法?
vue基本指令 本质就是自定义属性 Vue中指令都是以 v- 开头 v-cloak 防止页面加载时出现闪烁问题 v-text v-text指令用于将数据填充到标签中,作用于插值表达式类似,但是没有闪动问题 如果数据中有HTML标签会将html标签一并输出 注意:此处为单向绑定,数据对象上的值改变,插值会发生变化;但是当插值发生变化并不会影响数据对象的值 <div id="app"> <!-- 注意:在指令中不要写插值语法 直接写对应的变量名称 在 v-text
青梅煮码
2023/01/16
1.2K0
VUE-指令
指令 (Directives) 是带有 v- 前缀的特殊特性。指令特性的预期值是:单个 JavaScript 表达式。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。
cwl_java
2020/02/11
2.4K0
前端基础-Vue.js模板语法(指令)
指令 (Directives) 是带有 v- 前缀的特殊 特性 相当于自定义html属性。指令特性的值预期是单个 JavaScript 表达式 (v-for 是例外情况,稍后我们再讨论)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM;参考 手册 、 API
cwl_java
2020/03/26
9K0
02 . Vue入门基础之条件渲染,列表渲染,事件处理器,表单控件绑定
如果想注册局部指令,组件中接受一个directives的选项,位于vue实例参数里面,局部指令只能在本组件使用
iginkgo18
2020/11/24
4.6K0
02 . Vue入门基础之条件渲染,列表渲染,事件处理器,表单控件绑定
Vue3中如何使用自定义指令?
Vue是一款流行的JavaScript框架,它提供了许多强大的功能来简化前端开发。其中一个重要的特性就是自定义指令。Vue3作为Vue的最新版本,在自定义指令的功能上有了一些改进和新增的特性。本文将详细介绍Vue3中如何使用自定义指令,包括创建指令、钩子函数、指令修饰符等方面。
网络技术联盟站
2023/07/05
4860
相关推荐
Vue指令 - 从零开始学Vue2
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验