当前位置:首页 > VUE

vue实现组件通信

2026-03-28 16:26:32VUE

父子组件通信

父组件通过 props 向子组件传递数据,子组件通过 $emit 触发事件向父组件传递数据。

父组件:

<template>
  <ChildComponent :message="parentMessage" @childEvent="handleChildEvent" />
</template>

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

export default {
  components: { ChildComponent },
  data() {
    return {
      parentMessage: 'Hello from parent'
    };
  },
  methods: {
    handleChildEvent(data) {
      console.log('Received from child:', data);
    }
  }
};
</script>

子组件:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="sendToParent">Send to Parent</button>
  </div>
</template>

<script>
export default {
  props: ['message'],
  methods: {
    sendToParent() {
      this.$emit('childEvent', { data: 'Hello from child' });
    }
  }
};
</script>

兄弟组件通信

通过共同的父组件作为桥梁,或者使用事件总线、Vuex 等状态管理工具。

使用事件总线:

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

组件A:

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

EventBus.$emit('eventName', data);

组件B:

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

EventBus.$on('eventName', (data) => {
  console.log(data);
});

跨层级组件通信

使用 provide/inject 实现祖先组件向后代组件传递数据。

祖先组件:

export default {
  provide() {
    return {
      sharedData: 'Shared value'
    };
  }
};

后代组件:

export default {
  inject: ['sharedData'],
  mounted() {
    console.log(this.sharedData);
  }
};

Vuex 状态管理

适用于复杂应用中的全局状态管理。

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++;
    }
  },
  actions: {
    increment({ commit }) {
      commit('increment');
    }
  }
});

组件中使用:

export default {
  computed: {
    count() {
      return this.$store.state.count;
    }
  },
  methods: {
    increment() {
      this.$store.dispatch('increment');
    }
  }
};

使用 $refs 直接访问组件

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

父组件:

<template>
  <ChildComponent ref="child" />
</template>

<script>
export default {
  mounted() {
    this.$refs.child.childMethod();
  }
};
</script>

使用 $attrs 和 $listeners

用于传递未被 props 识别的特性和事件。

子组件:

<template>
  <div v-bind="$attrs" v-on="$listeners"></div>
</template>

使用 v-model 实现双向绑定

自定义组件支持 v-model

子组件:

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

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

父组件:

<template>
  <ChildComponent v-model="message" />
</template>

使用 .sync 修饰符

实现多个 props 的双向绑定:

父组件:

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

子组件:

vue实现组件通信

this.$emit('update:title', newTitle);

标签: 组件通信
分享给朋友:

相关文章

vue实现附件组件

vue实现附件组件

Vue 实现附件组件的方法 基础组件结构 使用 Vue 的单文件组件(SFC)方式创建一个基础的附件上传组件。需要包含文件选择、预览、上传和删除功能。 <template> <…

vue组件实现返回

vue组件实现返回

实现返回功能的 Vue 组件方法 监听浏览器返回事件 通过 window.addEventListener('popstate', callback) 监听浏览器返回按钮事件,在回调函数中执行自定义逻…

实现vue全局组件

实现vue全局组件

注册全局组件 在Vue中注册全局组件可以通过Vue.component方法完成。该方法接受两个参数:组件名称和组件选项对象。全局注册的组件可以在任何Vue实例的模板中使用,无需再次注册。 impor…

vue 日历组件实现

vue 日历组件实现

Vue 日历组件实现 基本结构搭建 使用Vue的单文件组件(SFC)结构,创建一个基础的日历组件框架。需要定义月份、年份的状态管理,以及日期渲染逻辑。 <template> <…

vue组件如何实现

vue组件如何实现

Vue 组件实现方法 Vue 组件可以通过多种方式实现,以下是常见的几种方法: 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template>…

vue 组件实现tap切换

vue 组件实现tap切换

实现 Vue 组件 Tap 切换的方法 在 Vue 中实现 Tab 切换功能可以通过动态组件或条件渲染实现。以下是两种常见方法: 动态组件结合 v-for 渲染 使用 v-for 循环生成 Tab…