vue 子頁面怎么調用父頁面的方法


vue高級組件之provide / inject

在vue中不同組件通信方式如下

1.父子組件,通過prop

2.非父子組件,通過vuex或根vue轉載器

 通常是以上兩種情況,然而還有一種比較特殊的情況,即孫子組件或更深層次的組件通信

1.下面是a.vue

  1.  
    <template>
  2.  
    <div class="test">
  3.  
    <son prop="data"></son>
  4.  
    </div>
  5.  
    </template>

2.下面是son.vue

  1.  
    <template>
  2.  
    <div>
  3.  
    <grandson prop="data"></grandson>
  4.  
    </div>
  5.  
    </template>
  6.  
     
  7.  
    <script>
  8.  
    export default {
  9.  
    name: 'Son',
  10.  
    props: ['data'],
  11.  
    }
  12.  
    </script>

很容易看出,如果父組件需要與grandson通信,除了vuex,必須先與son組件通信,再由son與grandson通信,在層級比較少的情況下也無可厚非,但是層級一旦多起來是很可怕的

有人會問為什么不用vuex,簡單省事,有很多為了這個引入vuex會導致代碼性價比比較低,項目本身沒有使用vuex的必要

那么這種情況下provide / inject就登場了

1.provide就相當於加強版父組件prop

2.inject就相當於加強版子組件的props 

因為以上兩者可以在父組件與子組件、孫子組件、曾孫子...組件數據交互,也就是說不僅限於prop的父子組件數據交互,只要在上一層級的聲明的provide,那么下一層級無論多深都能夠通過inject來訪問到provide的數據

1.父級組件如下

  1.  
    <template>
  2.  
    <div class="test">
  3.  
    <son prop="data"></son>
  4.  
    </div>
  5.  
    </template>
  6.  
     
  7.  
    <script>
  8.  
    export default {
  9.  
    name: 'Test',
  10.  
    provide: {
  11.  
    name: 'Garrett'
  12.  
    }
  13.  
    }

 2.孫子組件,注意這里是孫子組件,父級 -> 子組件 -> 孫子組件三個層級關系

  1.  
    <template>
  2.  
    <div>
  3.  
    {{name}}
  4.  
    </div>
  5.  
    </template>
  6.  
     
  7.  
    <script>
  8.  
    export default {
  9.  
    name: 'Grandson',
  10.  
    inject: [name]
  11.  
    }
  12.  
    </script>

這里可以通過inject直接訪問其兩個層級上的數據,其用法與props完全相同,同樣可以參數校驗等

缺點

這么做也是有明顯的缺點的,在任意層級都能訪問導致數據追蹤比較困難,不知道是哪一個層級聲明了這個或者不知道哪一層級或若干個層級使用了,因此這個屬性通常並不建議使用能用vuex的使用vuex,不能用的多傳參幾層,但是在做組件庫開發時,不對vuex進行依賴,且不知道用戶使用環境的情況下可以很好的使用


免責聲明!

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



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