admin管理员组文章数量:1031253
【Vue #3】指令补充&样式绑定
一、指令修饰符
Vue 的指令修饰符(Directive Modifiers)是 Vue 模板语法中的重要特性,它们以半角句号 .
开头,用于对指令的绑定行为进行特殊处理
修饰符作用如下:
- 简化事件处理(如阻止默认行为、停止冒泡)
- 精准控制输入(如自动格式化表单值)
- 优化性能(如延迟数据同步)
- 增强交互(如精确控制按键触发)
类型 | 常用修饰符 |
---|---|
事件 | .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运行复制<a @click.stop.prevent="doSomething">同时阻止冒泡和默认行为</a>
代码示例如下:
代码语言:javascript代码运行次数:0运行复制<script setup>
import { ref } from 'vue'
const onPClick = () => {
console.log('onPClick')
}
const onDivClick = () => {
console.log('onDivClick')
}
</script>
<template>
<div @click="onDivClick">
<a href="/">百度一下</a>
<p></p>
<!-- .prevent: 阻止默认行为 -->
<a href="/" @click.prevent>百度一下</a>
<!-- .stop: 阻止冒泡, 同名事件不会向上传递 -->
<p @click.stop="onPClick">I miss You</p>
<!-- 修饰符的链式调用: 表名两个同时阻止 -->
<a href="/" @click.stop.prevent>百度一下</a>
</div>
</template>
2. 按键修饰符(Key Modifiers)
用于 v-on:keyup
或 v-on:keydown
,监听特定按键:
① 按键别名
代码语言:javascript代码运行次数:0运行复制<input @keyup.enter="submit"> 回车键触发
<input @keyup.esc="close"> ESC 键触发
<input @keyup.delete="deleteItem"> 删除键触发
② 系统修饰键
代码语言:javascript代码运行次数:0运行复制<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. 自定义修饰符
在自定义指令中定义自己的修饰符:
代码语言:javascript代码运行次数:0运行复制<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>
代码解析:
- 参数处理 (
:skyblue
)- 通过
binding.arg
获取指令参数 - 直接作为背景颜色使用(支持颜色名称、十六进制、RGB等格式)
- 示例中
:skyblue
会设置background-color: skyblue
- 通过
- 修饰符处理 (
.bold.italic
)- 通过
binding.modifiers
对象检查修饰符 - 支持多个修饰符组合使用:
.bold
→font-weight: bold
.italic
→font-style: italic
.underline
→text-decoration: underline
- 通过
- 值处理 (
="'#333'"
)- 通过
binding.value
获取指令值 - 用于设置文字颜色
- 注意在模板中需要使用引号包裹字符串值
- 通过
修饰符机制说明:
- Vue 会自动解析指令后的点号标识符为修饰符
- 例如
v-color.bold.italic
会生成:
binding.modifiers = {
bold: true,
italic: true
}
6. 修饰符最佳实践
① 链式顺序影响结果
代码语言:javascript代码运行次数:0运行复制<!-- 先阻止冒泡,再阻止默认行为 -->
<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
——> valuev-model
写在select上,关联是选中option的value
- 单选框
input:radio
——> value- 给单选框添加value属性,
v-model
收集选中单选框的value
- 给单选框添加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 #3】指令补充&样式绑定
一、指令修饰符
Vue 的指令修饰符(Directive Modifiers)是 Vue 模板语法中的重要特性,它们以半角句号 .
开头,用于对指令的绑定行为进行特殊处理
修饰符作用如下:
- 简化事件处理(如阻止默认行为、停止冒泡)
- 精准控制输入(如自动格式化表单值)
- 优化性能(如延迟数据同步)
- 增强交互(如精确控制按键触发)
类型 | 常用修饰符 |
---|---|
事件 | .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运行复制<a @click.stop.prevent="doSomething">同时阻止冒泡和默认行为</a>
代码示例如下:
代码语言:javascript代码运行次数:0运行复制<script setup>
import { ref } from 'vue'
const onPClick = () => {
console.log('onPClick')
}
const onDivClick = () => {
console.log('onDivClick')
}
</script>
<template>
<div @click="onDivClick">
<a href="/">百度一下</a>
<p></p>
<!-- .prevent: 阻止默认行为 -->
<a href="/" @click.prevent>百度一下</a>
<!-- .stop: 阻止冒泡, 同名事件不会向上传递 -->
<p @click.stop="onPClick">I miss You</p>
<!-- 修饰符的链式调用: 表名两个同时阻止 -->
<a href="/" @click.stop.prevent>百度一下</a>
</div>
</template>
2. 按键修饰符(Key Modifiers)
用于 v-on:keyup
或 v-on:keydown
,监听特定按键:
① 按键别名
代码语言:javascript代码运行次数:0运行复制<input @keyup.enter="submit"> 回车键触发
<input @keyup.esc="close"> ESC 键触发
<input @keyup.delete="deleteItem"> 删除键触发
② 系统修饰键
代码语言:javascript代码运行次数:0运行复制<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. 自定义修饰符
在自定义指令中定义自己的修饰符:
代码语言:javascript代码运行次数:0运行复制<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>
代码解析:
- 参数处理 (
:skyblue
)- 通过
binding.arg
获取指令参数 - 直接作为背景颜色使用(支持颜色名称、十六进制、RGB等格式)
- 示例中
:skyblue
会设置background-color: skyblue
- 通过
- 修饰符处理 (
.bold.italic
)- 通过
binding.modifiers
对象检查修饰符 - 支持多个修饰符组合使用:
.bold
→font-weight: bold
.italic
→font-style: italic
.underline
→text-decoration: underline
- 通过
- 值处理 (
="'#333'"
)- 通过
binding.value
获取指令值 - 用于设置文字颜色
- 注意在模板中需要使用引号包裹字符串值
- 通过
修饰符机制说明:
- Vue 会自动解析指令后的点号标识符为修饰符
- 例如
v-color.bold.italic
会生成:
binding.modifiers = {
bold: true,
italic: true
}
6. 修饰符最佳实践
① 链式顺序影响结果
代码语言:javascript代码运行次数:0运行复制<!-- 先阻止冒泡,再阻止默认行为 -->
<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
——> valuev-model
写在select上,关联是选中option的value
- 单选框
input:radio
——> value- 给单选框添加value属性,
v-model
收集选中单选框的value
- 给单选框添加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 3指令补充amp样式绑定
版权声明:本文标题:【Vue #3】指令补充&样式绑定 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747718778a2208415.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论