vue子組件設計provide和inject理解使用
引言
閱讀element-ui源碼,發(fā)現(xiàn)在設計子組時件用到了inject
屬性,隨即查了一下官方文檔,得知vue在2.2.0版本里新增了provide
/ inject
:
provide
和 inject
主要在開發(fā)高階插件/組件庫時使用。并不推薦用于普通應用程序代碼中。
按照文檔的描述,我的理解是:在多級嵌套的組件體系中,某級外層組件可以通過provide
屬性向其下任意一級子組件提供一個依賴,不管層級有多深;而某級子組件則可以通過inject
屬性接收來自其上任意一級父組件提供的依賴(通過this.xxx
形式獲?。?。注意:provide
和inject
需要一起使用。
舉個例子說明
清朝三位皇帝:康熙(玄燁)、雍正(胤禛)、乾?。ê霘v)是祖孫三代,我們用vue組件的思想表示他們之間的關系,并模擬他們的一段對話,以此理解vue中的provide
和inject
。
調用組件
——大清帝國:qing-dynasty.vue
<!--組件的嵌套關系--> <kangxi> <yongzheng> <qianlong></qianlong> </yongzheng> </kangxi>
定義爺爺組件
——康熙皇帝:kangxi.vue
<template> <div class="kangxi"> 康熙皇帝 <slot></slot> </div> </template> <script> export default { name: 'kangxi', // 爺爺對兒子提供‘kangxiToYongzheng' // 對孫子提供‘kangxiToQianlong' provide: { kangxiToYongzheng: '康熙皇帝對雍正皇帝說:"你是我兒子"', kangxiToQianlong: '康熙皇帝對乾隆皇帝說:"你是我孫子"' }, data () { return {} } } </script> <style lang="scss"> .kangxi { width: 200px; height: 140px; text-align: center; background-color: #ffb599; } </style>
定義兒子組件
——雍正皇帝:yongzheng.vue
<template> <div class="yongzheng"> 雍正皇帝 <slot></slot> </div> </template> <script> export default { name: 'yongzheng', // 兒子接收父親提供的‘kangxiToYongzheng' inject: ['kangxiToYongzheng'], // 同時,兒子也給孫子提供‘yongzhengToQianlong' provide: { yongzhengToQianlong: '雍正皇帝對乾隆皇帝說:"你是我兒子"' }, data () { return {} }, created () { // 可以通過this獲取 console.log(this.kangxiToYongzheng, ' 雍正皇帝回答:"是的,爸爸"') } } </script> <style lang="scss"> .yongzheng { width: 160px; height: 100px; margin: 0 auto; text-align: center; background-color: #84b5ff; } </style>
// 打印結果
康熙皇帝對雍正皇帝說:"你是我兒子" 雍正皇帝回答:"是的,爸爸"
定義孫子組件
——乾?。簈ianlong.vue
<template> <div class="qianlong"> 乾隆皇帝 </div> </template> <script> export default { name: 'qianlong', // 孫子接收爺爺?shù)摹甼angxiToQianlong'、父親的‘yongzhengToQianlong' inject: ['kangxiToQianlong', 'yongzhengToQianlong'], data () { return {} }, created () { // 可以通過this獲取 console.log(this.kangxiToQianlong, ' 乾隆皇帝回答:"是的,爺爺"') console.log(this.yongzhengToQianlong, ' 乾隆皇帝回答:"是的,爸爸"') } } </script> <style lang="scss"> .qianlong { width: 120px; height: 60px; margin: 0 auto; text-align: center; background-color: blanchedalmond; } </style>
// 打印結果
康熙皇帝對乾隆皇帝說:"你是我孫子" 乾隆皇帝回答:"是的,爺爺"
雍正皇帝對乾隆皇帝說:"你是我兒子" 乾隆皇帝回答:"是的,爸爸"
以上就是vue子組件設計provide和inject理解使用的詳細內容,更多關于vue子組件設計provide inject的資料請關注腳本之家其它相關文章!