在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ react16的異步渲染具體指哪里異步了?

react16的異步渲染具體指哪里異步了?

問題:react16實現(xiàn)了異步渲染,
1.這個異步渲染實現(xiàn)原理是啥?
2.跟vue的異步更新dom類似嗎?
在vue中如果數(shù)據(jù)發(fā)生變化,vue會開啟隊列緩存,然后在瀏覽器的下一個tick會開始Vue 刷新隊列
并執(zhí)行實際 (已去重的) 工作。
3.那么react提到的異步渲染也是指在下一個tick實現(xiàn)實際的更新dom的操作嗎?

回答
編輯回答
故林

react里有updateQuque和事務機的概念,你可以了解下。因為react本身的容錯機制做得很好,如果你做了setState后進入生命周期時又觸發(fā)setState的操作,react不會報錯,反而會推進下一個batchUpdate中,并標記一系列dirtyComp,在后續(xù)的事物周期再次處理

2017年9月14日 10:12
編輯回答
獨特范

給你貼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); // 異步呀
    }
}

2017年10月25日 09:55
編輯回答
初念

題主看這篇文章:

https://zhuanlan.zhihu.com/p/...

同道中人。

之前知道setState是異步,但不知道其內部機制以及render觸發(fā)的時機。以此去閱讀源碼,可惜我還沒能摸清細節(jié)就迎來了Fiber更新,閱讀難度驟然上升,直至今天仍沒全部搞懂,但是對大體的機制有一些自己的了解,這里拋磚引玉,談談個人看法,同時希望能有更了解內部機制的大神來談談,比如司徒正美。

=======================================================

首先明確“異步”指的是“并非每次setState都會觸發(fā)re-render”。實際上樓上的回答已經涉及到了實現(xiàn)原理,即setState本質上是更新一個隊列,然后在后續(xù)邏輯中根據(jù)隊列內容計算state,觸發(fā)更新。

class組件的更新過程為例,可以大致看出具體的實現(xiàn)。完整代碼點擊鏈接查看,這里摘取部分代碼分析:

clipboard.png

clipboard.png

上述代碼是componentWillReceiveProps執(zhí)行的過程,這里先不管setState方法的實現(xiàn)??梢钥碿wr僅僅是被執(zhí)行了,沒有跟渲染或者狀態(tài)相關的代碼。

clipboard.png

這是狀態(tài)計算的代碼,是與生命周期分離的。updateClassInstance最終返回是否需要更新的結果,接下來的代碼在這里

clipboard.png

clipboard.png

re-render是在這里進行的。所以看出setState和render完全是分離的。只有在該走的生命周期結束后才會統(tǒng)一render。

這里還沒有介紹setState的內部實現(xiàn),你可以自己去看一下,fiber調度部分可以跳過,大概能看出是在更新隊列。(我要去跑步沒時間寫了)

2017年12月30日 09:41