日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

vue 中provide的用法_聊聊Vue中provide/inject的应用详解

發布時間:2024/4/19 vue 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue 中provide的用法_聊聊Vue中provide/inject的应用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

眾所周知,在組件式開發中,最大的痛點就在于組件之間的通信。在 Vue 中,Vue 提供了各種各樣的組件通信方式,從基礎的 props/$emit 到用于兄弟組件通信的 EventBus,再到用于全局數據管理的 Vuex。

在這么多的組件通信方式中,provide/inject 顯得十分阿卡林(毫無存在感)。但是,其實 provide/inject 也有它們的用武之地。今天,我們就來聊聊 Vue 中 provide/inject 的應用。

何為 provide/inject

provide/inject 是 Vue 在 2.2.0 版本新增的 API,官網介紹如下:

這對選項需要一起使用,以允許一個祖先組件向其所有子孫后代注入一個依賴,不論組件層次有多深,并在起上下游關系成立的時間里始終生效。如果你熟悉 React,這與 React 的上下文特性很相似。

官網的解釋很讓人疑惑,那我翻譯下這幾句話:

provide 可以在祖先組件中指定我們想要提供給后代組件的數據或方法,而在任何后代組件中,我們都可以使用 inject 來接收 provide 提供的數據或方法。

舉個官網的🌰:

// 父級組件提供 'foo'

var Provider = {

provide: {

foo: 'bar'

},

// ...

}

// 子組件注入 'foo'

var Child = {

inject: ['foo'],

created () {

console.log(this.foo) // => "bar"

}

// ...

}

可以看到,父組件提供的 foo 變量被子組件成功接收并使用。

了解了 provide/inject 是什么后,我們再來使用使用 provide/inject。

使用 provide/inject 做全局狀態管理

在日常開發中,我們經常會使用 Vuex 做狀態管理,但是,我個人一直不喜歡使用 Vuex,原因在于 Vuex 為了保持狀態可被回溯追蹤,使用起來太過繁瑣;而我之前參與的項目,較少多人合作,這個功能對于我來說,意義不大,我僅僅只需要 Vuex 中提供全局狀態的功能。

那么,有沒有方便快捷的實現全局狀態的方法呢?當然有,這就是 provide/inject 這個黑科技 API 的一種使用方法。

很多人也許會想到一種方式:在根組件中,傳入變量,然后在后代組件中使用即可。

// 根組件提供一個非響應式變量給后代組件

export default {

provide () {

return {

text: 'bar'

}

}

}

// 后代組件注入 'app'

{{this.text}}

export default {

inject: ['text'],

created() {

this.text = 'baz' // 在模板中,依然顯示 'bar'

}

}

這個想法,說對也對,說不對也不對,原因在于 provide 的特殊性。

在官網文檔中關于 provide/inject 有這么一個提示:

提示:provide 和 inject 綁定并不是可響應的。這是刻意為之的。然而,如果你傳入了一個可監聽的對象,那么其對象的屬性還是可響應的。

也就是說,Vue 不會對 provide 中的變量進行響應式處理。所以,要想 inject 接受的變量是響應式的,provide 提供的變量本身就需要是響應式的。

由于組件內部的各種狀態就是可響應的,所以我們直接在根組件中將組件本身注入 provide,此時,我們可以在后代組件中任意訪問根組件中的所有狀態,根組件就成為了全局狀態的容器,仔細想想,是不是很像 React 中的 context 呢?

代碼如下:

// 根組件提供將自身提供給后代組件

export default {

provide () {

return {

app: this

}

},

data () {

return {

text: 'bar'

}

}

}

// 后代組件注入 'app'

{{this.app.text}}

export default {

inject: ['app'],

created() {

this.app.text = 'baz' // 在模板中,顯示 'baz'

}

}

也許有的同學會問:使用 $root 依然能夠取到根節點,那么我們何必使用 provide/inject 呢?

在實際開發中,一個項目常常有多人開發,每個人有可能需要不同的全局變量,如果所有人的全局變量都統一定義在根組件,

勢必會引起變量沖突等問題。

使用 provide/inject 不同模塊的入口組件傳給各自的后代組件可以完美的解決該問題。

慎用 provide/inject

既然 provide/inject 如此好用,那么,為什么 Vue 官方還要推薦我們使用 Vuex,而不是用原生的 API 呢?

我在前面提到過,Vuex 和 provide/inject 最大的區別在于,Vuex 中的全局狀態的每次修改是可以追蹤回溯的,而 provide/inject 中變量的修改是無法控制的,換句話說,你不知道是哪個組件修改了這個全局狀態。

Vue 的設計理念借鑒了 React 中的單向數據流原則(雖然有 sync 這種破壞單向數據流的家伙),而 provide/inject 明顯破壞了單向數據流原則。試想,如果有多個后代組件同時依賴于一個祖先組件提供的狀態,那么只要有一個組件修改了該狀態,那么所有組件都會受到影響。這一方面增加了耦合度,另一方面,使得數據變化不可控。如果在多人協作開發中,這將成為一個噩夢。

在這里,我總結了兩條條使用 provide/inject 做全局狀態管理的原則:

多人協作時,做好作用域隔離

盡量使用一次性數據作為全局狀態

看起來,使用 provide/inject 做全局狀態管理好像很危險,那么有沒有 provide/inject 更好的使用方式呢?當然有,那就是使用 provide/inject 編寫組件。

使用 provide/inject 編寫組件

使用 provide/inject 做組件開發,是 Vue 官方文檔中提倡的一種做法。

以我比較熟悉的 elementUI 來舉例:

在 elementUI 中有 Button(按鈕)組件,當在 Form(表單)組件中使用時,它的尺寸會同時受到外層的 FormItem 組件以及更外層的 Form 組件中的 size 屬性的影響。

如果是常規方案,我們可以通過 props 從 Form 開始,一層層往下傳遞屬性值。看起來只需要傳遞傳遞兩層即可,還可以接受。但是,Form 的下一層組件不一定是 FormItem,FormItem 的下一層組件不一定是 Button,它們之間還可以嵌套其他組件,也就是說,層級關系不確定。如果使用 props,我們寫的組件會出現強耦合的情況。

provide/inject 可以完美的解決這個問題,只需要向后代注入組件本身(上下文),后代組件中可以無視層級任意訪問祖先組件中的狀態。

部分源碼如下:

// Button 組件核心源碼

export default {

name: 'ElButton',

// 通過 inject 獲取 elForm 以及 elFormItem 這兩個組件

inject: {

elForm: {

default: ''

},

elFormItem: {

default: ''

}

},

// ...

computed: {

_elFormItemSize() {

return (this.elFormItem || {}).elFormItemSize;

},

buttonSize() {

return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;

},

//...

},

// ...

};

總結

其實在 Vue 的學習中,遵循著二八法則,我們常用的 20% 的 API 就能解決大部分日常問題,剩余的 API 感覺用處不大。但是,抽點時間去了解那些冷門的 API,也許你能發現一些不一般的風景,令你在解決一些問題時,事半功倍。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的vue 中provide的用法_聊聊Vue中provide/inject的应用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 911亚洲精选 | 动漫美女被x | 精品91自产拍在线观看二区 | 九九夜 | 日本涩涩视频 | 偷偷操99 | 视频一区 中文字幕 | 久久777| 国产理论精品 | 婷婷亚洲五月色综合 | 大桥未久av一区二区三区中文 | 成人三级晚上看 | 桃色av| 综合天天| 熟女av一区二区三区 | 国产一区二区在线播放视频 | 波多野结衣激情视频 | 99riav国产精品 | 公侵犯一区二区三区 | 国产爽视频 | 国产网站入口 | 天天操天天弄 | 91视频看看| 国产亚洲性欧美日韩在线观看软件 | 爱爱视频网址 | www在线观看国产 | 一个人在线观看www软件 | 超碰69| 亚洲大胆视频 | 99草视频| 无遮挡边吃摸边吃奶边做 | 丝袜人妻一区二区 | 久久综合五月 | 午夜黄色在线 | 久久一区二区电影 | 免费观看国产视频 | 久久成人精品视频 | 男女做爰猛烈吃奶啪啪喷水网站 | 18av在线播放 | av片观看 | 日韩高清久久 | 日韩精品1| 色哟哟网站入口 | av日韩在线播放 | 北京少妇xxxx做受 | 激情av| 中国av一区| 天天操女人 | 国产啊啊啊啊 | 九热在线| 成人国产毛片 | 白丝美女喷水 | 在线va视频| 爱情岛论坛亚洲自拍 | 成人区人妻精品一区二区网站 | 中文字幕乱码一区二区三区 | 蜜臀va | 精品欧美一区二区三区免费观看 | 东方影库av| 日韩av在线免费 | 中文字幕35页 | 欧美xxxx黑人又粗又长密月 | 国产精品久久久久久久久久久免费看 | 国产成人免费视频 | 狠狠躁18三区二区一区传媒剧情 | 黄网av | 亚洲精品一区二区三区蜜臀 | 欧美综合图片 | 日本三级小视频 | 日韩亚洲在线 | 午夜精品一区二区三区在线视频 | 黄色大片a级 | 日韩精品999| 丰满肥臀噗嗤啊x99av | 人人模人人爽 | 伊人久久国产 | 二区中文字幕 | 成人快色 | 人妻熟女一区二区aⅴ水 | 国产女人呻吟高潮抽搐声 | 欧美色老头old∨ideo | 国产视频在线免费观看 | 91官网在线观看 | 午夜福利理论片在线观看 | 美女诱惑一区二区 | 99久久久国产精品免费蜜臀 | www.88av | 四虎5151久久欧美毛片 | www.亚洲国产 | 成人乱码一区二区三区av | 男人资源网站 | 激情吧 | 日日操夜夜爽 | 久久黄色小说 | 久久精品国产99精品国产亚洲性色 | 欧美日韩激情一区二区 | 真人毛片视频 | 国产一在线 | 狠狠干狠狠操视频 |