当前位置:首页 > VUE

vue父子实现

2026-03-09 23:16:02VUE

Vue 父子组件通信实现方法

Vue 中父子组件通信可以通过多种方式实现,主要包括 props、自定义事件、ref 和 provide/inject 等。以下是几种常见的实现方式:

父组件向子组件传递数据(props)

父组件通过 props 向子组件传递数据,子组件通过 props 选项接收数据。

父组件代码:

<template>
  <ChildComponent :message="parentMessage" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  data() {
    return {
      parentMessage: 'Hello from parent'
    };
  }
};
</script>

子组件代码:

<template>
  <div>{{ message }}</div>
</template>

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

子组件向父组件传递数据(自定义事件)

子组件通过 $emit 触发自定义事件,父组件通过 v-on 监听事件并接收数据。

子组件代码:

<template>
  <button @click="sendMessage">Send Message</button>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message-from-child', 'Hello from child');
    }
  }
};
</script>

父组件代码:

<template>
  <ChildComponent @message-from-child="handleChildMessage" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  methods: {
    handleChildMessage(message) {
      console.log(message); // 'Hello from child'
    }
  }
};
</script>

使用 ref 直接访问子组件

父组件可以通过 ref 直接访问子组件的属性和方法。

父组件代码:

<template>
  <ChildComponent ref="childRef" />
  <button @click="callChildMethod">Call Child Method</button>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  methods: {
    callChildMethod() {
      this.$refs.childRef.childMethod();
    }
  }
};
</script>

子组件代码:

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

使用 provide/inject 跨层级传递数据

祖先组件通过 provide 提供数据,后代组件通过 inject 注入数据。

祖先组件代码:

<script>
export default {
  provide() {
    return {
      providedData: 'Data from ancestor'
    };
  }
};
</script>

后代组件代码:

<script>
export default {
  inject: ['providedData'],
  mounted() {
    console.log(this.providedData); // 'Data from ancestor'
  }
};
</script>

使用事件总线(Event Bus)

对于非父子组件通信,可以创建一个 Vue 实例作为事件总线。

事件总线代码:

// event-bus.js
import Vue from 'vue';
export const EventBus = new Vue();

发送组件代码:

<script>
import { EventBus } from './event-bus.js';

export default {
  methods: {
    sendMessage() {
      EventBus.$emit('message-event', 'Hello from sender');
    }
  }
};
</script>

接收组件代码:

vue父子实现

<script>
import { EventBus } from './event-bus.js';

export default {
  created() {
    EventBus.$on('message-event', message => {
      console.log(message); // 'Hello from sender'
    });
  }
};
</script>

以上方法可以根据具体场景选择使用,props 和自定义事件适用于直接的父子组件通信,provide/inject 适用于跨层级通信,事件总线适用于任意组件间通信。

标签: 父子vue
分享给朋友:

相关文章

vue响应式实现

vue响应式实现

Vue 响应式实现原理 Vue 的响应式系统基于 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)实现,通过数据劫持和依赖收集实现数据变化时的自动更新。…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <templat…

vue router 实现

vue router 实现

Vue Router 的实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的核心实现方式。 安装 Vue Router 通过…

vue 实现排序

vue 实现排序

Vue 实现排序的方法 使用计算属性实现排序 通过计算属性对数组进行排序,可以保持原始数据不变。示例代码展示了如何对列表按名称升序排序: <template> <div>…

自实现vue

自实现vue

实现 Vue 的核心功能 要实现一个简化版的 Vue,需要理解其核心功能:数据响应式、模板编译、虚拟 DOM 和组件系统。以下是关键步骤的分解: 数据响应式 Vue 使用 Object.define…

vue实现追加

vue实现追加

追加数据到数组或列表 在Vue中追加数据到数组或列表,可以通过push方法或concat方法实现。以下是几种常见的实现方式: 方法一:使用push方法 this.items.push(newIte…