Vue 组件之间通信的多种方式汇总

目录

引言

组件间通信的方式

1. 父子组件通信

父组件向子组件传递数据:Props

子组件向父组件传递数据:Events

2. 兄弟组件通信

使用 Vuex

3. 祖先与后代组件通信

使用 Provide / Inject

4. 使用 Event Bus

扫描二维码关注公众号,回复: 17482972 查看本文章

结论

参考资料


引言

Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。在 Vue 应用中,组件之间的通信是一个常见的需求。本文将详细介绍几种常用的 Vue 组件间通信方法,帮助开发者更好地管理和传递数据。

组件间通信的方式

1. 父子组件通信

父组件向子组件传递数据:Props

父组件可以通过 props子组件传递数据。

示例代码:

父组件

<template>
  <div>
    <child-component :message="parentMessage"></child-component>
  </div>
</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: String
  }
};
</script>
子组件向父组件传递数据:Events

子组件可以通过 $emit 触发事件,父组件监听这些事件并作出响应。

示例代码:

子组件

<template>
  <button @click="sendToParent">Send to Parent</button>
</template>

<script>
export default {
  methods: {
    sendToParent() {
      this.$emit('custom-event', 'Hello from Child');
    }
  }
};
</script>

父组件

<template>
  <div>
    <child-component @custom-event="handleEvent"></child-component>
    <p>{
   
   { messageFromChild }}</p>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      messageFromChild: ''
    };
  },
  methods: {
    handleEvent(message) {
      this.messageFromChild = message;
    }
  }
};
</script>

2. 兄弟组件通信

使用 Vuex

Vuex 是 Vue 的状态管理库,适用于复杂的应用场景。通过 Vuex,可以在多个组件之间共享状态。

示例代码:

store/index.js

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    sharedMessage: ''
  },
  mutations: {
    setSharedMessage(state, message) {
      state.sharedMessage = message;
    }
  },
  actions: {
    updateSharedMessage({ commit }, message) {
      commit('setSharedMessage', message);
    }
  }
});

组件 A

<template>
  <button @click="updateMessage">Update Message</button>
</template>

<script>
import { mapActions } from 'vuex';

export default {
  methods: {
    ...mapActions(['updateSharedMessage']),
    updateMessage() {
      this.updateSharedMessage('Hello from Component A');
    }
  }
};
</script>

组件 B

<template>
  <div>
    {
   
   { sharedMessage }}
  </div>
</template>

<script>
import { mapState } from 'vuex';

export default {
  computed: {
    ...mapState(['sharedMessage'])
  }
};
</script>

3. 祖先与后代组件通信

使用 Provide / Inject

Vue 提供了 provideinject 选项,用于祖先组件向后代组件传递数据。

示例代码:

祖先组件

<template>
  <div>
    <child-component></child-component>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  provide() {
    return {
      ancestorMessage: 'Hello from Ancestor'
    };
  }
};
</script>

后代组件

<template>
  <div>
    {
   
   { ancestorMessage }}
  </div>
</template>

<script>
export default {
  inject: ['ancestorMessage']
};
</script>

4. 使用 Event Bus

Event Bus 是一种简单的全局事件管理机制,适用于简单的跨组件通信。

示例代码:

event-bus.js

import Vue from 'vue';
export const EventBus = new Vue();

组件 A

<template>
  <button @click="sendEvent">Send Event</button>
</template>

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

export default {
  methods: {
    sendEvent() {
      EventBus.$emit('custom-event', 'Hello from Component A');
    }
  }
};
</script>

组件 B

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

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

export default {
  data() {
    return {
      message: ''
    };
  },
  created() {
    EventBus.$on('custom-event', (message) => {
      this.message = message;
    });
  }
};
</script>

结论

Vue 提供了多种组件间通信的方式,每种方式都有其适用的场景。选择合适的通信方式可以让你的应用更加灵活和高效。希望本文能帮助你在 Vue 开发中更好地管理和传递数据。

参考资料