1. v-model 的本质解析
在 Vue 生态中,v-model 指令堪称是父子组件通信的瑞士军刀。很多开发者对它的理解停留在表单绑定的层面,但实际上它的能力远不止于此。让我们先拆解它的核心机制:
1.1 语法糖的真相
v-model 本质上是一个语法糖,在 Vue 3 中,以下两种写法完全等价:
html复制<!-- 简洁写法 -->
<CustomInput v-model="searchText" />
<!-- 完整写法 -->
<CustomInput
:modelValue="searchText"
@update:modelValue="newValue => searchText = newValue"
/>
这个设计体现了 Vue 的"约定优于配置"理念。默认情况下:
- 接收的 prop 名为
modelValue - 触发的事件名为
update:modelValue
1.2 双向绑定实现原理
双向绑定的核心是单向数据流的变通实现。其工作流程如下:
- 数据下行:父组件通过 props 将数据传递给子组件
- 事件上行:子组件通过 emit 事件通知父组件数据变更
- 闭环更新:父组件更新数据后再次通过 props 下发
这种模式既保持了单向数据流的可预测性,又提供了类似双向绑定的便捷性。
关键提示:虽然看起来像双向绑定,但本质上仍是单向数据流。子组件不能直接修改 prop,必须通过事件通知父组件
1.3 Vue 2 到 Vue 3 的演进
在 Vue 2 时代,实现多个值的双向绑定需要使用 .sync 修饰符:
html复制<!-- Vue 2 方式 -->
<ChildComponent
:title.sync="pageTitle"
:content.sync="pageContent"
/>
Vue 3 将其统一为更直观的 v-model 语法:
html复制<!-- Vue 3 方式 -->
<ChildComponent
v-model:title="pageTitle"
v-model:content="pageContent"
/>
这种改进
