實現跨層組件通信(Vue3___defineComponent)


常用的父子組件通信方法:

 //父組件
 <template>
   <my-header :title="title" @changeTitle="changeTitle"></my-header>
 </tempale>
 <script>
   import myHeader from "@/components/Header.vue"; //引入組件
   export default {
   data(){
    return{
     title:"父傳子測試"
    }
   },
   components:{ 
     "my-header":myHeader  
    },
    methods:{
      changeTitle(val){
       this.title = val
      }
    }
   }
 </script>
 
 //子組件 myheader.vue
 <template>
   <h1>{{ title }}</h1>
   <button @click="triggerMethod">觸發父組件方法</button>
 </tempalte>
 <script>
  export default{
     props: {//接收父組件出來的title
        title:{
         type: String,
         default: ""
        }
     }, 
     methods:{
      triggerMethod:function(){
       this.$emit("changeTitle","傳參數");  //子組件通過$emit 與父組件通信  
      }
     }
  }
 </script>
 

 

provide/inject(提供/注入),可以實現跨層組件(祖孫)間通信,不需要將數據一層一層向下傳遞:

//父組件 Father.vue
<template>
  <son></son>
</template>
<script>
 import { defineComponent, reactive, provide, computed } from "vue";
 import son from "@/components/Son";
 export default defineComponent({
  components: {
    son
  },
  setup() {
   let params = reactive({
      name: "來自父親的參數"
   })
   provide("name", computed(()=> params.name)); //用計算屬性返回值能夠動態傳遞來子/孫組件(當子孫組件通過方法觸發修改name值時)
   function changeName(val){
     params.name = val; //子孫組件觸發
   }
   provide("changeName",changeName);
  }
 })
</script>
//兒子組件 Son.vue
<template>
  <h2>{{ name }}</h2>  
  <button @click="changeName('兒子組件觸發')">兒子組件觸發Name修改</button>
  <div class="grandson">
    <grandson></grandson>
  </div>
</template>
<script>
import grandson from "@/components/grandson";
import { defineComponent, inject } from "vue";
export default defineComponent({
  components: { grandson },
  setup() {
    let name = inject("name");  //接收Father組件傳來的name
    let changeName = inject("changeName"); //接收方法
    return {
      name,
      changeName,
    };
  },
});
</script>
//孫子組件 grandson.vue
<template>
  <h2>{{ name }}</h2>
  <button @click="changeName('孫子組件觸發')">孫子組件觸發Name修改</button>
</template>
<script>
import { defineComponent, inject, watch } from "vue";
export default defineComponent({
  name: "HelloWorld",
  setup() {
    let name = inject("name");
    let changeName = inject("changeName");
    watch(name,(newValue,oldValue)=>{
      //這里可以監聽name的變化
    })
    return {
      name,
      changeName,
    };
  },
});
</script>

子孫組件都接收到Father組件傳來的參數"來自Father組件的參數"。

當點擊兒子組件或者孫子組件按鈕時,觸發changeName事件在Father組件上修改name值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM