当前位置:首页 > VUE

vue父子通讯优雅实现

2026-01-23 12:57:29VUE

Vue 父子组件通信的优雅实现方案

Props 与事件传递

父组件通过 props 向子组件传递数据,子组件通过 $emit 触发事件通知父组件。这是 Vue 官方推荐的基础通信方式。

父组件示例:

<template>
  <ChildComponent :message="parentMessage" @update="handleUpdate"/>
</template>

<script>
export default {
  data() {
    return {
      parentMessage: 'Hello from parent'
    }
  },
  methods: {
    handleUpdate(newValue) {
      this.parentMessage = newValue
    }
  }
}
</script>

子组件示例:

<template>
  <button @click="notifyParent">Click me</button>
</template>

<script>
export default {
  props: ['message'],
  methods: {
    notifyParent() {
      this.$emit('update', 'New value from child')
    }
  }
}
</script>

v-model 语法糖

对于表单类组件,可以使用 v-model 实现双向绑定,本质上是 props 和事件的语法糖。

父组件:

<ChildComponent v-model="parentValue"/>

子组件:

<template>
  <input :value="value" @input="$emit('input', $event.target.value)"/>
</template>

<script>
export default {
  props: ['value']
}
</script>

.sync 修饰符

需要双向绑定时,可以使用 .sync 修饰符简化代码。

父组件:

<ChildComponent :title.sync="pageTitle"/>

子组件:

<script>
export default {
  props: ['title'],
  methods: {
    updateTitle() {
      this.$emit('update:title', 'New Title')
    }
  }
}
</script>

Provide/Inject

跨层级组件通信可以使用这对 API,适用于深层嵌套组件场景。

祖先组件:

export default {
  provide() {
    return {
      theme: 'dark'
    }
  }
}

后代组件:

export default {
  inject: ['theme']
}

事件总线

对于非父子关系的组件,可以创建中央事件总线。

创建事件总线:

// eventBus.js
import Vue from 'vue'
export const EventBus = new Vue()

组件A发送事件:

EventBus.$emit('event-name', payload)

组件B接收事件:

EventBus.$on('event-name', payload => {
  // 处理逻辑
})

Vuex 状态管理

对于复杂应用,使用 Vuex 集中管理状态是最佳实践。

store 定义:

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  }
})

组件中使用:

this.$store.commit('increment')
console.log(this.$store.state.count)

作用域插槽

当需要父组件控制子组件内部部分内容的渲染时,可以使用作用域插槽。

子组件:

<template>
  <div>
    <slot :user="user"></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      user: {
        name: 'John'
      }
    }
  }
}
</script>

父组件:

<ChildComponent>
  <template v-slot:default="slotProps">
    {{ slotProps.user.name }}
  </template>
</ChildComponent>

$refs 引用

在需要直接访问子组件实例时可以使用,但应谨慎使用以避免过度耦合。

父组件:

<ChildComponent ref="child"/>

访问子组件:

vue父子通讯优雅实现

this.$refs.child.childMethod()

每种方案都有其适用场景,应根据具体需求选择最合适的通信方式。简单场景优先使用 props/events,复杂场景考虑 Vuex 或事件总线。

标签: 父子优雅
分享给朋友:

相关文章

纯vue实现父子组件

纯vue实现父子组件

纯 Vue 实现父子组件 在 Vue 中,父子组件的通信和实现主要通过 props 和 events 完成。以下是实现父子组件的核心方法: 父组件向子组件传递数据 父组件通过 props 向子组件传…

react如何实现父子通信

react如何实现父子通信

父子组件通信方法 在React中,父子组件通信主要通过props和回调函数实现。以下是几种常见方式: 父组件向子组件传递数据 通过props将数据从父组件传递给子组件。父组件定义属性,子组件通过p…

vue实现父子组件

vue实现父子组件

Vue 父子组件通信实现方法 父组件向子组件传递数据(Props) 在父组件中通过 v-bind 或简写 : 将数据传递给子组件。子组件通过 props 接收数据。 父组件代码示例: <te…

vue实现父子通讯

vue实现父子通讯

Vue 父子组件通信方法 父组件向子组件传递数据(Props) 父组件通过 props 向子组件传递数据。子组件需要在 props 中声明接收的属性。 父组件模板: <template>…

vue实现父子组件通信

vue实现父子组件通信

父组件向子组件传值(Props) 父组件通过 props 向子组件传递数据。在子组件中声明 props,父组件通过绑定属性传递值。 父组件代码示例: <template> <…

vue列表实现父子级

vue列表实现父子级

Vue 列表实现父子级的方法 在 Vue 中实现父子级列表通常涉及递归组件或嵌套数据结构。以下是几种常见实现方式: 递归组件实现 递归组件适合处理无限层级或深度不确定的树形数据: <temp…