当前位置:首页 > VUE

vue实现父子组件通信

2026-01-21 23:30:11VUE

Vue 父子组件通信方法

Props 传递数据

父组件通过 props 向子组件传递数据。在子组件中定义 props 接收父组件传递的值。

父组件模板:

<template>
  <ChildComponent :message="parentMessage" />
</template>
<script>
export default {
  data() {
    return {
      parentMessage: 'Hello from parent'
    }
  }
}
</script>

子组件接收:

<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  props: ['message']
}
</script>

自定义事件 ($emit)

子组件通过 $emit 触发事件,父组件通过 v-on 监听事件并处理。

子组件触发事件:

<template>
  <button @click="sendMessage">Send</button>
</template>
<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message-sent', 'Child data')
    }
  }
}
</script>

父组件监听:

<template>
  <ChildComponent @message-sent="handleMessage" />
</template>
<script>
export default {
  methods: {
    handleMessage(data) {
      console.log(data) // 'Child data'
    }
  }
}
</script>

v-model 双向绑定

实现父子组件数据的双向绑定,本质是 props$emit 的语法糖。

子组件定义:

<template>
  <input :value="value" @input="$emit('input', $event.target.value)" />
</template>
<script>
export default {
  props: ['value']
}
</script>

父组件使用:

<template>
  <ChildComponent v-model="parentData" />
</template>
<script>
export default {
  data() {
    return {
      parentData: ''
    }
  }
}
</script>

$refs 访问子组件

父组件通过 ref 属性直接访问子组件实例和方法。

父组件模板:

<template>
  <ChildComponent ref="child" />
  <button @click="callChildMethod">Call Child</button>
</template>
<script>
export default {
  methods: {
    callChildMethod() {
      this.$refs.child.childMethod()
    }
  }
}
</script>

子组件定义方法:

<script>
export default {
  methods: {
    childMethod() {
      console.log('Child method called')
    }
  }
}
</script>

$parent 和 $children

子组件通过 $parent 访问父组件实例,父组件通过 $children 访问子组件实例(不推荐,耦合性高)。

子组件访问父组件:

<script>
export default {
  methods: {
    callParentMethod() {
      this.$parent.parentMethod()
    }
  }
}
</script>

Provide/Inject

祖先组件通过 provide 提供数据,后代组件通过 inject 注入数据(适合跨层级通信)。

祖先组件:

<script>
export default {
  provide() {
    return {
      sharedData: 'Shared value'
    }
  }
}
</script>

后代组件:

<script>
export default {
  inject: ['sharedData'],
  created() {
    console.log(this.sharedData) // 'Shared value'
  }
}
</script>

Event Bus

通过全局事件总线实现任意组件间通信,适合非父子关系组件。

创建事件总线:

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

组件A发送事件:

import { EventBus } from './eventBus'
EventBus.$emit('event-name', data)

组件B接收事件:

import { EventBus } from './eventBus'
EventBus.$on('event-name', data => {
  console.log(data)
})

Vuex 状态管理

对于复杂应用,使用 Vuex 集中管理状态,实现组件间共享数据。

store 定义:

// store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

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

组件中使用:

// 触发 mutation
this.$store.commit('increment')

// 获取状态
this.$store.state.count

方法选择建议

  • 简单父子通信:优先使用 props$emit
  • 需要双向绑定:使用 v-model
  • 跨层级通信:考虑 provide/inject 或 Vuex
  • 全局事件:使用 Event Bus
  • 复杂状态管理:采用 Vuex

每种方法都有适用场景,根据具体需求选择最合适的方案。

vue实现父子组件通信

标签: 父子组件
分享给朋友:

相关文章

vue实现组件跟随

vue实现组件跟随

实现组件跟随的常见方法 使用CSS定位 通过CSS的position: fixed或position: absolute属性实现组件跟随。需要结合JavaScript计算目标元素的位置。 &…

vue组件的实现

vue组件的实现

Vue 组件的实现方式 Vue 组件可以通过多种方式实现,主要包括单文件组件(SFC)、全局注册和局部注册。以下是常见的实现方法: 单文件组件(SFC) 单文件组件是 Vue 最推荐的组件化开发方式…

vue实现多级组件

vue实现多级组件

Vue 多级组件实现方法 在 Vue 中实现多级组件通常涉及父子组件通信、动态组件或递归组件等技术。以下是几种常见实现方式: 父子组件嵌套 通过逐层嵌套组件实现多级结构,适用于固定层级场景:…

vue怎么实现组件缓存

vue怎么实现组件缓存

vue实现组件缓存的方法 在Vue中实现组件缓存可以通过内置的<keep-alive>组件完成,该组件能够缓存不活动的组件实例,避免重复渲染。 使用<keep-alive>…

vue穿梭框组件实现

vue穿梭框组件实现

实现 Vue 穿梭框组件的基本思路 穿梭框(Transfer)组件通常用于在两个列表之间移动数据项。核心功能包括左侧列表、右侧列表、移动按钮(左移、右移、全选等)以及数据项的渲染与交互。 基础结构…

uniapp如何将底部导航组件化

uniapp如何将底部导航组件化

在 uniapp 中将底部导航组件化 将底部导航组件化可以提高代码复用性和维护性。以下是具体实现方法: 创建自定义底部导航组件 新建一个组件文件,例如 tab-bar.vue,放置在 comp…