Vue.js 组件通信知识点总结
1. v-model 的工作原理
- 概念:
v-model是 Vue.js 中用于实现父组件与子组件之间的双向数据绑定的语法糖。 - 拆解:
v-model="dataModel"等价于:value="dataModel"和@input="dataModel = $event"。- 父组件将
dataModel作为prop传递给子组件的value。 - 子组件通过
$emit('input', newValue)事件将newValue传递给父组件,更新dataModel的值。
2. $emit 和 input 事件
- 概念: 子组件通过
$emit触发事件,向父组件传递数据。 - input 事件:
input事件是v-model默认绑定的事件,用于将子组件的数据变化同步到父组件。- 子组件调用
this.$emit('input', newValue)时,父组件会接收到newValue,并更新v-model绑定的变量。
3. <component :is="..." /> 动态组件
- 概念:
<component>标签用于在运行时根据传递的组件名称动态渲染不同的组件。 - 用法:
:is="componentName"中的componentName是一个动态的值,返回所需组件的名称。
4. v-bind 传递多个 prop
- 概念:
v-bind指令可以用来动态绑定多个 prop。 - 用法:
v-bind="{ ...item }"传递item对象的所有属性作为 prop 到子组件。
5. 父子组件通信中的数据流
- 数据流向:
- 父组件将数据通过
props传递给子组件(单向)。 - 子组件通过
$emit触发事件,将数据传回给父组件(单向)。 v-model实现了这两个方向的数据绑定(双向),v-model默认使用value和input事件来进行绑定。
- 父组件将数据通过
6. 具体示例
a.vue
vue
<component :is="getComponentName(item)" :item="item" v-model="dataModel" v-bind="{ ...item }" />- 动态渲染组件。
- 传递
item和item中的所有属性到子组件。 v-model="dataModel"实现数据的双向绑定。
b.vue
javascript
this.$emit('input', this.dataValue);- 通过
$emit触发input事件,将dataValue传递给父组件,更新v-model绑定的变量dataModel。
7. 常见问题
v-model和input事件的多次触发:- 子组件可能多次触发
input事件,导致父组件的值多次更新。
- 子组件可能多次触发
- 父组件接收的值与预期不符:
- 确保
input事件传递的值正确,并且父组件中的v-model变量是你希望更新的目标变量。
- 确保
8. 实际应用场景
- 使用
v-model实现表单输入组件的双向数据绑定。 - 动态组件渲染,如表单项组件,根据配置动态渲染不同类型的输入框、选择框等。
- 通过
$emit事件,实现组件之间的灵活通信。
Backy文档