1、provide/inject有什么用?
常用的父子組件通信方式都是父組件綁定要傳遞給子組件的數據,子組件通過props
屬性接收,一旦組件層級變多時,采用這種方式一級一級傳遞值非常麻煩,而且代碼可讀性不高,不便后期維護。
vue
提供了provide
和inject
幫助我們解決多層次嵌套嵌套通信問題。在provide
中指定要傳遞給子孫組件的數據,子孫組件通過inject
注入祖父組件傳遞過來的數據。
使用場景:由於vue有$parent屬性可以讓子組件訪問父組件。但孫組件想要訪問祖先組件就比較困難。通過provide/inject可以輕松實現跨級訪問祖先組件的數據
2、provide/inject使用方式
provide
:是一個對象 / 返回對象的函數。
里面是屬性和屬性值。
注意:子孫層的provide
會掩蓋祖父層provide
中相同key
的屬性值
inject
:一個字符串數組,或者是一個對象。
屬性值可以是一個對象,包含from
和default
默認值,from
是在可用的注入內容中搜索用的 key
(字符串或 Symbol
),意思就是祖父多層provide
提供了很多數據,from
屬性指定取哪一個key
;
default
指定默認值。
具體用法:
父組件
<template> <div> </div> </template> <script> export default { components: { MergeTipDialog, BreakNetTip }, data () { return { isShow: false, isRouterAlive: true }, // 父組件中返回要傳給下級的數據 可以使函數,也可以是data中的數據 provide () { return { reload: this.reload
isShow:this.isShow } }, methods: { reload () { this.isRouterAlive = false this.$nextTick(() => { this.isRouterAlive = true }) } } } </script>
子孫
<template> <popup-assign :id="id" @success="successHandle" > <div class="confirm-d-tit"><span class="gray-small-btn">{{ name }}</span></div> <strong>將被分配給</strong> <a slot="reference" class="unite-btn" > 指派 </a> </popup-assign> </template> <script> import PopupAssign from '../PopupAssign' export default { //引用vue reload方法 內容 isShow inject: ['reload','isShow'], components: { PopupAssign }, methods: { async successHandle () { this.reload() } } } </script>
vue3.0用法
父組件
子組件