摘要:以上面的例子為代表完整生命周期如下下一篇,應(yīng)該會(huì)以為例,介紹一種基于來(lái)解決跨組件的數(shù)據(jù)通信的方式免費(fèi)領(lǐng)取驗(yàn)證碼內(nèi)容安全短信發(fā)送直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)分享請(qǐng)?jiān)L問(wèn)網(wǎng)易云社區(qū)。文章來(lái)源網(wǎng)易云社區(qū)
本文由作者鄭海波授權(quán)網(wǎng)易云社區(qū)發(fā)布。
背景
在組件化不斷深入的大環(huán)境下,無(wú)論使用哪種 MDV 框架都最終會(huì)遇到一個(gè)頭疼的問(wèn)題,就是「跨組件通信」。
下圖是個(gè)簡(jiǎn)單的例子
這里包含「事件通信」和「數(shù)據(jù)通信」兩個(gè)維度。
事件傳遞
為了將事件 click 從
數(shù)據(jù)傳遞
為了從
以上處理方式除了帶來(lái)性能上的損耗之外,更麻煩的就是造成了可維護(hù)性的急速下降。
顯而易見(jiàn)的事件通信解決方案
最直接的做法就是引入一個(gè)「中介者」,簡(jiǎn)而言之就是一個(gè)全局的「跳板」,下例就是一個(gè)事件中介者
mediator.js
const Regular = require("regularjs");const emitter = new Regular;//每個(gè)Regular組件都是一個(gè)事件發(fā)射器module.exports = {
broadcast: emiter.$emit.bind(emiter), subscribe: emiter.$on.bind(emiter)
}
Top.js
const { broadcast, subscribe } = require("./mediator")const Regular = require("regularjs");const Top = Regular.extend({
name: "Top", init(){ subscribe("check", ev =>{ // 通過(guò)emitter廣播事件 }) }
})
LeafNode.js
const { broadcast, subscribe } = require("path/to/mediator")const Regular = require("regularjs");const LeafNode = Regular.extend({
template: ``, name: "LeafNode", onClick(){ broadcast( "check", { type: "leafnode" } ) }
})
mediator 作為一個(gè)全局單例直接被 LeafNode 和 Top 引用,通過(guò)它實(shí)現(xiàn)了直接通信.
更麻煩的兄弟節(jié)點(diǎn)之間的通信當(dāng)然也可以這樣來(lái)解決。
顯而易見(jiàn)的解決方案引出的另一個(gè)顯而易見(jiàn)的問(wèn)題
上述中介者的引入的最大問(wèn)題就是,所有相關(guān)組件都在 定義時(shí) 引入了對(duì)emitter的 全局耦合, 這個(gè)將導(dǎo)致組件無(wú)法在多工程間被復(fù)用。
一種合理的解決方案就是將對(duì)emitter的耦合, 延遲到實(shí)例化階段。
在Regular之前的版本里,很多朋友會(huì)通過(guò)this.$parent或this.$outer等可控性很差的方式來(lái)實(shí)現(xiàn),在v0.6有了一種更好的方式。
modifyBodyComponent 新生命周期
在 Regular 的 v0.6 引入了一個(gè)新的生命周期叫 modifyBodyComponent ,它用來(lái)劫持到組件包裹的所有內(nèi)部組件的初始化周期。
我們用一個(gè)簡(jiǎn)單例子來(lái)實(shí)現(xiàn)下emitter的動(dòng)態(tài)注入
Broadcastor.js
const Regular = require("regularjs");const Broadcastor = Regular.extend({
name: "Broadcastor", config( data ){ const emitter = data.emitter; this._broadcast = emitter.$emit.bind(emitter), this._subscribe = emitter.$on.bind(emitter) }, modifyBodyComponent( component, next ){ component.$broadcast = this._broadcast; component.$subscribe = this._subscribe; next(component) // 交給外層的包裝器 }
})
Top.js
// const { broadcast, subscribe } = require("./mediator")const Regular = require("regularjs");const Top = Regular.extend({
name: "Top", template: "略...", init(){ this.$subscribe("check", ev =>{ // 通過(guò)emitter廣播事件 }) }
})
LeafNode.js
// const { broadcast, subscribe } = require("path/to/mediator")const Regular = require("regularjs");const LeafNode = Regular.extend({
template: ``, name: "LeafNode", onClick(){ this.$broadcast( "check", { type: "leafnode" } ) }
})
main.js (入口)
new Regular({
template:``, data: { emitter: new Regular }
})
這樣所有的組件聲明都取消了對(duì)全局 emitter 的直接依賴,而是在入口(main.js) 動(dòng)態(tài)傳入了一個(gè)emitter。
生命周期
需要注意的是modifyBodyComponent 會(huì)在 component本身compile之后運(yùn)行, 但在init之前運(yùn)行。以上面的例子為代表, 完整生命周期如下.
Broadcastor.config -> Broadcastor.compile
- Top.config -> Top.compile - LeafNode.config -> LeafNode.compile - Broadcastor.modifyBodyComponent(LeafNode) - LeafNode.init - Broadcastor.modifyBodyComponent(Top) - Top.init
Broadcastor.init
下一篇,應(yīng)該會(huì)以redux(rgl-redux)為例,介紹一種基于modifyBodyComponent來(lái)解決跨組件的數(shù)據(jù)通信的方式
免費(fèi)領(lǐng)取驗(yàn)證碼、內(nèi)容安全、短信發(fā)送、直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐
更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營(yíng)經(jīng)驗(yàn)分享請(qǐng)?jiān)L問(wèn)網(wǎng)易云社區(qū)。
文章來(lái)源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25335.html
摘要:不要小看這個(gè)優(yōu)化,由于內(nèi)部監(jiān)聽(tīng)器中的比例很高超過(guò)所以在的情況下,可以帶來(lái)比較大的提升。但是它的時(shí)間復(fù)雜度是,在大列表下會(huì)帶來(lái)顯著的性能開(kāi)銷甚至完全超過(guò)更新的開(kāi)銷。更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)分享請(qǐng)?jiān)L問(wèn)網(wǎng)易云社區(qū)。文章來(lái)源網(wǎng)易云社區(qū) 本文由作者鄭海波授權(quán)網(wǎng)易云社區(qū)發(fā)布。 本文旨在用 20% 的精力解決使用Regular過(guò)程中 80% 的性能問(wèn)題. 這里大部分是關(guān)于臟檢查的性能優(yōu)化,不了解的可...
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
摘要:父組件向子組件之間非常常見(jiàn),通過(guò)機(jī)制傳遞即可。我們應(yīng)該聽(tīng)說(shuō)過(guò)高階函數(shù),這種函數(shù)接受函數(shù)作為輸入,或者是輸出一個(gè)函數(shù),比如以及等函數(shù)。在傳遞數(shù)據(jù)的時(shí)候,我們可以用進(jìn)一步提高性能。 本文主要談自己在react學(xué)習(xí)的過(guò)程中總結(jié)出來(lái)的一些經(jīng)驗(yàn)和資源,內(nèi)容邏輯參考了深入react技術(shù)棧一書(shū)以及網(wǎng)上的諸多資源,但也并非完全照抄,代碼基本都是自己實(shí)踐,主要為平時(shí)個(gè)人學(xué)習(xí)做一個(gè)總結(jié)和參考。 本文的關(guān)鍵...
閱讀 2435·2021-10-09 09:44
閱讀 3792·2021-09-22 15:43
閱讀 2924·2021-09-02 09:47
閱讀 2539·2021-08-12 13:29
閱讀 3871·2019-08-30 15:43
閱讀 1680·2019-08-30 13:06
閱讀 2189·2019-08-29 16:07
閱讀 2745·2019-08-29 15:23