教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Vue組件間通信有哪幾種方式?

更新時間:2023年06月07日11時14分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓

  在Vue中,組件之間可以通過不同的方式進行通信。以下是幾種常見的方式:

      1.Props/屬性:父組件可以通過props將數(shù)據(jù)傳遞給子組件。子組件可以通過props接收父組件傳遞的數(shù)據(jù),并在其模板中使用。這是最基本和常見的組件通信方式之一。

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent :message="parentMessage" />
  </div>
</template>

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

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

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

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

  2.自定義事件:子組件可以通過$emit方法觸發(fā)一個自定義事件,并向父組件傳遞數(shù)據(jù)。父組件可以在子組件上使用v-on指令監(jiān)聽該自定義事件,并在父組件中處理觸發(fā)的事件。

<!-- ChildComponent.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

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

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent @custom-event="handleEvent" />
  </div>
</template>

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

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

  3.Vuex/共享狀態(tài)管理:Vuex是Vue官方提供的狀態(tài)管理庫,用于在組件之間共享和管理狀態(tài)。通過Vuex,組件可以從共享狀態(tài)中讀取數(shù)據(jù),并使用提交mutations或觸發(fā)actions的方式更新共享狀態(tài)。

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ message }}</p>
    <button @click="updateMessage">Update Message</button>
  </div>
</template>

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

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

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent />
  </div>
</template>

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

export default {
  components: {
    ChildComponent,
  },
};
</script>

<!-- store.js -->
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    message: 'Hello from Vuex store',
  },
  mutations: {
    updateMessage(state, newMessage) {
      state.message = newMessage;
    },
  },
});

  4.$refs:通過在組件上使用ref屬性,父組件可以通過this.$refs訪問子組件實例,并直接調(diào)用子組件的方法或訪問子組件的屬性。這種方式主要用于父組件主動調(diào)用子組件的方法或獲取子組件的狀態(tài)。

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent ref="child" />
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

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

export default {
  methods: {
    sendMessage() {
      this.$refs.child.receiveMessage('Hello from parent component');
    },
  },
  components: {
    ChildComponent,
  },
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

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

  5.Event Bus/事件總線:創(chuàng)建一個Vue實例作為事件中心,可以通過該實例的$emit和$on方法進行組件之間的通信。組件可以通過$emit方法觸發(fā)自定義事件,其他組件可以通過$on方法監(jiān)聽并處理這些事件。

// eventBus.js
import Vue from 'vue';

const eventBus = new Vue();

export default eventBus;
// eventBus.js
import Vue from 'vue';

const eventBus = new Vue();

export default eventBus;

     通過使用事件總線,任何組件都可以通過事件觸發(fā)和監(jiān)聽來進行通信,不論它們之間的關(guān)系是父子組件、兄弟組件還是跨級組件。

  這些是一些常見的Vue組件間通信方式,每種方式都有其適用的場景和特點。選擇合適的方式取決于你的具體需求和組件之間的關(guān)系。

0 分享到:
和我們在線交談!