vue3 非父子組件通信詳解

業務場景是,不是父子組件實現通信

文件目錄

在這裡插入圖片描述

第一種方法

App.vue

<template>
  <div>
    <Home></Home>
    <button @click="addName">增加名字</button>
  </div>
</template>
 <script>
import Home from "./Home.vue";
import { computed } from "vue";
export default {
  name: "App",
  components: {
    Home,
  },
  provide() {
    return {
      name: "張三",
      age: 23,
      length: computed(() => this.names.length),
    };
  },
  data() {
    return {
      names: ["張三", "李四", "王五"],
    };
  },
  methods: {
    addName() {
      this.names.push("fuck you");
      console.log("hhhh");
    },
  },
};
</script>
 <style scoped>
</style>

Home.vue

<template>
  <div>
    <div>我是home</div>
    <home-content></home-content>
  </div>
</template>
 <script>
import HomeContent from "./HomeContent.vue";
export default {
  name: "Home",
  components: {
    HomeContent,
  },
};
</script>
 <style scoped>
</style>

HomeContent.vue

<template>
  <div>HomeContent:{{ name }}--{{ age }}---{{ length }}</div>
</template>
 <script>
export default {
  inject: ["name", "age", "length"],
};
</script>
 <style lang="scss" scoped>
</style>

vue3中使用Provide函數和Inject函數

事實上我們之前還學習過Provide和Inject,Composition API也可以替代之前的 Provide 和 Inject 的選項。

我們可以通過 provide來提供數據:

provide可以傳入兩個參數:

name:提供的屬性名稱;

value:提供的屬性值;

在這裡插入圖片描述

在 後代組件 中可以通過 inject 來註入需要的屬性和對應的值:

可以通過 inject 來註入需要的內容;

inject可以傳入兩個參數:

要 inject 的 property 的 name;

默認值;

在這裡插入圖片描述

數據的響應式

為瞭增加 provide 值和 inject 值之間的響應性,我們可以在 provide 值時使用 ref 和 reactive。

修改響應式Property

如果我們需要修改可響應的數據,那麼最好是在數據提供的位置來修改:我們可以將修改方法進行共享,在後代組件中進行調用;

註意

如果我們子組件應該是隻能使用,不能修改的狀態

在這裡插入圖片描述

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: