父子组件传递数据

子:

<template>
  <el-tree @node-click="nodeclick">

  </el-tree>
</template> 

<script>
export default {
  methods: {
    nodeclick (data, node, component) {
      console.log(`子組件category的节点被点击`, data, node, component)
      // 向父组件发送事件
      this.$emit(`tree-node-click`, data, node, component);
    }
  },
}
</script> 

父:

<template>
  <el-row :gutter="20">
    <el-col :span="6">
      <category @tree-node-click="treenodeclick"> </category>
    </el-col>
  </el-row>
</template>

<script>
export default {
  methods: {
    // 感知树节点被点击
    treenodeclick (data, node, component) {
      console.log(`attrgroup感知到category的节点被点击:`, data, node, component)
      console.log(`刚才被点击的菜单id:`, data.catId)
    },
  }
}
</script> 
### Vue.js 中父子组件通过 `v-model` 和自定义事件传值的区别 #### 1. **概念上的区别** - 使用 `v-model` 是一种语法糖,简化了父子组件之间的双向绑定逻辑。它本质上是对特定属性 (`modelValue`) 和事件 (`update:modelValue`) 的封装[^1]。 - 非 `v-model` 方式的数据传递通常依赖于显式声明的 props 和 `$emit` 方法来触发自定义事件[^2]。 --- #### 2. **实现机制的不同** ##### (1) **`v-model` 实现机制** 当父组件使用 `<child-component v-model="parentData"></child-component>` 时: - 子组件会自动接收到一个名为 `modelValue` 的 prop(默认情况下),并可以通过该 prop 访问父组件的数据。 - 当子组件内部需要更新父组件的状态时,它可以调用 `$emit('update:modelValue', newValue)` 来通知父组件更改其绑定的变量。 示例代码如下: ```vue <!-- 父组件 --> <template> <ChildComponent v-model="parentMessage" /> </template> <script> export default { data() { return { parentMessage: 'Hello' }; } }; </script> ``` ```vue <!-- 子组件 --> <template> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /> </template> <script> export default { props: ['modelValue'] }; </script> ``` ##### (2) **非 `v-model` 实现机制** 如果未使用 `v-model`,则需要手动指定 prop 名称以及对应的事件名称。例如: 父组件向子组件传递数据的方式保持不变,但子组件通过 `$emit` 显式发送事件名和新值给父组件[^3]。 示例代码如下: ```vue <!-- 父组件 --> <template> <ChildComponent :message="parentMessage" @change-message="(newVal) => parentMessage = newVal" /> </template> <script> export default { data() { return { parentMessage: 'Hello' }; } }; </script> ``` ```vue <!-- 子组件 --> <template> <input :value="message" @input="$emit('change-message', $event.target.value)" /> </template> <script> export default { props: ['message'] }; </script> ``` --- #### 3. **语义化与简洁性的对比** - **`v-model` 更加简洁**:由于它是专门用于处理输入/输出场景的设计模式,因此减少了开发者对具体事件名称的记忆负担[^4]。 - **非 `v-model` 提供更高的灵活性**:允许自由命名事件和参数,适合更复杂的交互需求。 --- #### 4. **适用场景差异** - 如果只是简单的单向或双向绑定关系,则优先考虑使用 `v-model`,因为它能显著提升代码可读性和维护效率。 - 对于多维度状态同步或者复杂业务逻辑下的通信需求,可能更适合采用传统的 Props + Events 模型。 --- ### 总结表 | `v-model` VS 自定义事件传值 | 特性 | `v-model` | 自定义事件传值 | |--------------------------|------------------------------------|-------------------------------| | 属性名称 | 默认为 `modelValue` | 可随意设置 | | 更新事件名称 | 默认为 `update:modelValue` | 开发者自行决定 | | 是否支持双向绑定 | 支持 | 不直接支持 | | 编码复杂度 | 较低 | 较高 | | 场景适应能力 | 单一输入控件 | 多种复杂交互 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值