問題:react16實現(xiàn)了異步渲染,
1.這個異步渲染實現(xiàn)原理是啥?
2.跟vue的異步更新dom類似嗎?
在vue中如果數(shù)據(jù)發(fā)生變化,vue會開啟隊列緩存,然后在瀏覽器的下一個tick會開始Vue 刷新隊列
并執(zhí)行實際 (已去重的) 工作。
3.那么react提到的異步渲染也是指在下一個tick實現(xiàn)實際的更新dom的操作嗎?
給你貼preact源碼
function setState(state, callback) {
let s = this.state;
if (!this.prevState) this.prevState = extend({}, s);
extend(s, typeof state==='function' ? state(s, this.props) : state);
if (callback) this._renderCallbacks.push(callback);
enqueueRender(this);
}
function enqueueRender(component) {
if (!component._dirty && (component._dirty = true) && items.push(component)==1) {
(options.debounceRendering || defer)(rerender); // 異步呀
}
}
完
題主看這篇文章:
同道中人。
之前知道setState是異步,但不知道其內部機制以及render觸發(fā)的時機。以此去閱讀源碼,可惜我還沒能摸清細節(jié)就迎來了Fiber更新,閱讀難度驟然上升,直至今天仍沒全部搞懂,但是對大體的機制有一些自己的了解,這里拋磚引玉,談談個人看法,同時希望能有更了解內部機制的大神來談談,比如司徒正美。
=======================================================
首先明確“異步”指的是“并非每次setState都會觸發(fā)re-render”。實際上樓上的回答已經涉及到了實現(xiàn)原理,即setState本質上是更新一個隊列,然后在后續(xù)邏輯中根據(jù)隊列內容計算state,觸發(fā)更新。
以class組件的更新過程為例,可以大致看出具體的實現(xiàn)。完整代碼點擊鏈接查看,這里摘取部分代碼分析:
上述代碼是componentWillReceiveProps執(zhí)行的過程,這里先不管setState方法的實現(xiàn)??梢钥碿wr僅僅是被執(zhí)行了,沒有跟渲染或者狀態(tài)相關的代碼。
這是狀態(tài)計算的代碼,是與生命周期分離的。updateClassInstance最終返回是否需要更新的結果,接下來的代碼在這里
re-render是在這里進行的。所以看出setState和render完全是分離的。只有在該走的生命周期結束后才會統(tǒng)一render。
這里還沒有介紹setState的內部實現(xiàn),你可以自己去看一下,fiber調度部分可以跳過,大概能看出是在更新隊列。(我要去跑步沒時間寫了)
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。