v-if、v-model和自定义指令是如何工作的?
指令是带有 v- 前缀的特殊模板属性,用于把响应式数据或行为绑定到 DOM、组件或模板结构上:
| 指令 | 作用 |
|---|---|
v-if | 条件创建和销毁节点 |
v-show | 通过 CSS display 控制显示隐藏 |
v-for | 列表渲染 |
v-bind / : | 绑定属性或 prop |
v-on / @ | 绑定事件 |
v-model | 表单值与状态同步 |
v-slot / # | 使用插槽 |
v-html | 插入 HTML 字符串 |
v-once | 只渲染一次 |
v-memo | 条件满足时跳过子树更新 |
v-if 和v-showv-if:条件为 false 时不创建或会销毁节点,切换成本高,初始条件为 false 时可以避免创建。v-show:节点始终存在,只切换 display,适合频繁切换。选择时关注两个维度:初始渲染成本和切换频率,而不是简单记忆“少用 v-if”。
v-for 与 keykey 用于标识同级节点身份,帮助 Vue 正确复用组件实例和 DOM。动态列表中不建议使用 index,尤其是列表会插入、删除、排序或过滤时。
v-if 与 v-for 同时出现在一个元素上时,应避免依赖它们的优先级,优先使用计算属性过滤数据或包一层模板:
v-bind 与v-on动态绑定本质上会进入组件或元素的 props / event 处理流程。可以使用对象绑定:
修饰符会改变指令行为,例如:
v-model 的本质在原生输入框上,v-model 可以理解为 value 绑定加 input 事件监听:
近似于:
在 Vue 3 组件上,默认对应 modelValue prop 和 update:modelValue 事件:
v-html 的安全问题v-html 会把字符串作为 HTML 插入 DOM,不会自动替你清理不可信内容:
如果内容来自用户输入或外部接口,应先经过可靠的 HTML 清洗,避免 XSS。能使用普通插值时,优先使用插值,因为插值默认会进行文本转义。
自定义指令适合封装与 DOM 直接交互的可复用逻辑,例如自动聚焦:
常用钩子包括:
createdbeforeMountmountedbeforeUpdateupdatedbeforeUnmountunmounted指令应聚焦 DOM 行为;如果逻辑主要是状态、请求或跨组件通信,通常更适合写成组件或 composable。
v-show 不会销毁组件,v-if 可能销毁并重新创建组件。v-model 不是双向绑定黑盒,本质是值传递和事件回传。v-html 不是安全的富文本渲染方案。Vue 指令是模板编译器识别的特殊语法。编译阶段会把
v-if、v-for、v-bind、v-on、v-model等转换成条件、列表、props 和事件处理逻辑;自定义指令则通过生命周期钩子封装 DOM 交互。v-if控制节点创建销毁,v-show只控制显示状态,v-model本质是 value 与事件的组合。