Vue组件之间的多种通信方式父子,兄弟,跨级通信

目录

  1. 前言
  2. 父子组件通信
  3. 兄弟组件通信
  4. 跨级组件通信
  5. 总结
  6. 相关阅读
    在这里插入图片描述

1. 前言

在Vue.js开发中,组件是构建应用的基本单元。随着应用规模的增大,组件之间的通信变得尤为重要。本文将详细介绍Vue组件之间的多种通信方式,帮助你彻底搞懂组件通信。

2. 父子组件通信

2.1 props

props是父组件向子组件传递数据的方式。父组件通过属性绑定将数据传递给子组件,子组件通过props接收数据。

示例:

<!-- 父组件 -->
<template>
  <child-component :message="parentMessage"></child-component>
</template>

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

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

<!-- 子组件 -->
<template>
  <div>{
   
   { message }}</div>
</template>

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

2.2 事件$emit

子组件可以通过$emit触发事件,将数据传递给父组件。父组件通过监听子组件触发的事件来接收数据。

示例:

<!-- 父组件 -->
<template>
  <child-component @childEvent="handleChildEvent"></child-component>
</template>

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

export default {
  methods: {
      handleChildEvent(data) {
      console.log(data);
    }
  },
  components: {
    ChildComponent
  }
};
</script>

<!-- 子组件 -->
<template>
  <button @click="sendMessage">Send Message</button>
</template>

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

3. 兄弟组件通信

3.1 父组件中转

兄弟组件间的通信可以通过共同的父组件来实现。父组件接收一个子组件的数据并将其传递给另一个子组件。

示例:

<!-- 父组件 -->
<template>
  <child-one @sendToSibling="handleSiblingData"></child-one>
  <child-two :siblingMessage="siblingMessage"></child-two>
</template>

<script>
import ChildOne from './ChildOne.vue';
import ChildTwo from './ChildTwo.vue';

export default {
  data() {
    return {
      siblingMessage: ''
    };
  },
  methods: {
    handleSiblingData(data) {
      this.siblingMessage = data;
    }
  },
  components: {
    ChildOne,
    ChildTwo
  }
};
</script>

<!-- 子组件1 -->
<template>
  <button @click="sendMessage">Send to Sibling</button>
</template>

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

<!-- 子组件2 -->
<template>
  <div>{
   
   { siblingMessage }}</div>
</template>

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

3.2 事件总线(Event Bus)

事件总线是一种基于Vue实例的全局事件发布/订阅模式,适用于兄弟组件间的通信。

示例:

// EventBus.js
import Vue from 'vue';
export const EventBus = new Vue();
<!-- 兄弟组件1 -->
<template>
  <button @click="sendMessage">Send to Sibling</button>
</template>

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

export default {
  methods: {
    sendMessage() {
      EventBus.$emit('messageFromSibling', 'Hello from Sibling');
    }
  }
};
</script>

<!-- 兄弟组件2 -->
<template>
  <div>{
   
   { message }}</div>
</template>

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

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

4. 跨级组件通信

4.1 provide/inject

provide/inject是一种适用于祖先组件与后代组件之间通信的机制。祖先组件通过provide提供数据,后代组件通过inject注入数据。

示例:

扫描二维码关注公众号,回复: 17505051 查看本文章
<!-- 祖先组件 -->
<template>
  <child-component></child-component>
</template>

<script>
export default {
  provide() {
    return {
      message: 'Hello from Ancestor'
    };
  }
};
</script>

<!-- 后代组件 -->
<template>
  <div>{
   
   { message }}</div>
</template>

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

4.2 Vuex

Vuex是Vue.js的状态管理模式,适用于跨组件和跨页面的全局状态管理。

示例:

// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
    
    
  state: {
    
    
    message: ''
  },
  mutations: {
    
    
    setMessage(state, payload) {
    
    
      state.message = payload;
    }
  },
  actions: {
    
    
    updateMessage({
     
      commit }, message) {
    
    
      commit('setMessage', message);
    }
  }
});
<!-- 组件1 -->
<template>
  <button @click="sendMessage">Send Message</button>
</template>

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

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

<!-- 组件2 -->
<template>
  <div>{
   
   { message }}</div>
</template>

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

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

5. 总结

在Vue.js中,组件之间的通信方式多种多样。针对不同的场景和需求,选择合适的通信方式至关重要。本文介绍了父子组件之间的props$emit、兄弟组件之间的父组件中转和事件总线、以及跨级组件之间的provide/inject和Vuex。理解和灵活运用这些通信方式,能够有效提高Vue.js开发的效率和代码的可维护性。

6. 相关阅读

猜你喜欢

转载自blog.csdn.net/gz_qiulinyong/article/details/140296413