摘要:最近在看源碼,發(fā)覺(jué)以前對(duì)的理解實(shí)在浮淺,這里記錄了一些以前疏忽的點(diǎn)。和在里面,經(jīng)過(guò)的解析后,會(huì)變成執(zhí)行后的結(jié)果。原來(lái)對(duì)的理解就是類(lèi)似這種寫(xiě)法,現(xiàn)在看了實(shí)現(xiàn)之后才理解。
最近在看react源碼,發(fā)覺(jué)以前對(duì)react的理解實(shí)在浮淺,這里記錄了一些以前疏忽的點(diǎn)。
createElement和component在react里面,經(jīng)過(guò)babel的解析后,jsx會(huì)變成createElement執(zhí)行后的結(jié)果。
const Test = (props) =>hello, {props.name}
;
實(shí)際上當(dāng)我們從開(kāi)始加載到渲染的時(shí)候做了下面幾步:
// 1. babel解析jsxkey-> createElement(Test, {name: "world"}) // 2. 對(duì)函數(shù)組件和class組件進(jìn)行處理 // 如果是類(lèi)組件,不做處理,如果是函數(shù)組件,增加render方法 const props = {name: world}; const newTest = new Component(props); newTest.render = function() { return Test(props); } // 3. 執(zhí)行render方法 newTest.render();
react中的diff會(huì)根據(jù)子組件的key來(lái)對(duì)比前后兩次virtual dom(即使前后兩次子組件順序打亂),所以這里的key最好使用不會(huì)變化的值,比如id之類(lèi)的,最好別用index,如果有兩個(gè)子組件互換了位置,那么index就會(huì)導(dǎo)致diff全部失效。
cloneElement原來(lái)對(duì)cloneElement的理解就是類(lèi)似cloneElement(App, {})這種寫(xiě)法,現(xiàn)在看了實(shí)現(xiàn)之后才理解。原來(lái)第一個(gè)參數(shù)應(yīng)該是一個(gè)reactElement,而不是一個(gè)reactComponent,應(yīng)該是
react里面setState后不會(huì)立即更新,但在某些場(chǎng)景下也會(huì)立即更新,下面這幾種情況打印的值你都能回答的上來(lái)嗎?
class App extends React.Component { state = { count: 0; } test() { this.setState({ count: this.state.count + 1 }); console.log(this.state.count); // 此時(shí)為0 this.setState({ count: this.state.count + 1 }); console.log(this.state.count); // 此時(shí)為0 } test2() { setTimeout(() => { this.setState({ count: this.state.count + 1 }); console.log(this.state.count); // 此時(shí)為1 this.setState({ count: this.state.count + 1 }); console.log(this.state.count); // 此時(shí)為2 }) } test3() { Promise.resolve().then(() => { this.setState({ count: this.state.count + 1 }); console.log(this.state.count); // 此時(shí)為1 this.setState({ count: this.state.count + 1 }); console.log(this.state.count); // 此時(shí)為2 }) } test4() { this.setState(prevState => { console.log(prevState.count); // 0 return { count: prevState.count + 1 }; }); this.setState(prevState => { console.log(prevState.count); // 1 return { count: prevState.count + 1 }; }); } async test4() { await 0; this.setState({ count: this.state.count + 1 }); console.log(this.state.count); // 此時(shí)為1 this.setState({ count: this.state.count + 1 }); console.log(this.state.count); // 此時(shí)為2 } }
在react中為了防止多次setState導(dǎo)致多次渲染帶來(lái)不必要的性能開(kāi)銷(xiāo),所以會(huì)將待更新的state放到隊(duì)列中,等到合適的時(shí)機(jī)(一般是組件第一次渲染或觸發(fā)事件后)后進(jìn)行batchUpdate,所以在setState后無(wú)法立即拿到更新后的state,很多人說(shuō)setState是異步的,setState表現(xiàn)確實(shí)是異步,只是里面沒(méi)有用異步代碼實(shí)現(xiàn)。
如果是給setState傳入一個(gè)函數(shù),這個(gè)函數(shù)是執(zhí)行前一個(gè)setState后才被調(diào)用的,所以函數(shù)返回的參數(shù)可以拿到更新后的state。
但是如果將setState在異步方法中(setTimeout、Promise等等)調(diào)用,由于方法是異步的,會(huì)導(dǎo)致組件pending結(jié)束后才執(zhí)行異步方法中的setState,這個(gè)時(shí)候由于組件已經(jīng)不處于pending狀態(tài)了,會(huì)導(dǎo)致setState立即執(zhí)行,這時(shí)通過(guò)this.state可以拿到最新的值。
ref用到原生的標(biāo)簽上,可以直接在組件內(nèi)部用this.refs.xxx的方法獲取到真實(shí)DOM。
ref用到組件上,需要用ReactDOM.findDOMNode(this.refs.xxx)的方式來(lái)獲取到這個(gè)組件對(duì)應(yīng)的DOM節(jié)點(diǎn)。
當(dāng)shouldComponentUpdate返回false的時(shí)候,組件沒(méi)有重新渲染,但是更新后的state和props已經(jīng)掛載到了組件上面,這個(gè)時(shí)候如果打印state和props,會(huì)發(fā)現(xiàn)拿到的已經(jīng)是更新后的了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99704.html
摘要:本文將根據(jù)以下章節(jié)分別梳理每個(gè)鉤子同步鉤子首先安裝是簡(jiǎn)單的同步鉤子,它很類(lèi)似于發(fā)布訂閱。至此,我們把的所有同步鉤子都解析完畢異步鉤子比同步鉤子麻煩些,我們會(huì)在下一章節(jié)開(kāi)始解析異步的鉤子傳送門(mén)深入理解核心模塊鉤子異步版代碼 記錄下自己在前端路上爬坑的經(jīng)歷 加深印象,正文開(kāi)始~ tapable是webpack的核心依賴庫(kù) 想要讀懂webpack源碼 就必須首先熟悉tapableok.下面是...
摘要:中的元素組件實(shí)例和節(jié)點(diǎn),是中關(guān)系密切的個(gè)概念,也是很容易讓初學(xué)者迷惑的個(gè)概念。組件和元素關(guān)系密切,組件最核心的作用是返回元素。只有組件實(shí)例化后,每一個(gè)組件實(shí)例才有了自己的和,才持有對(duì)它的節(jié)點(diǎn)和子組件實(shí)例的引用。 文:徐超,《React進(jìn)階之路》作者授權(quán)發(fā)布,轉(zhuǎn)載請(qǐng)注明作者及出處 React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深對(duì)React的理解...
摘要:所以對(duì)于組件更新階段的組件生命周期,我們簡(jiǎn)單提及并且提供一些資料給大家。這里為了知識(shí)的完整,補(bǔ)充關(guān)于更新階段的組件生命周期你可以通過(guò)這個(gè)方法控制組件是否重新渲染。大家對(duì)這更新階段的生命周期比較感興趣的話可以查看官網(wǎng)文檔。 React.js 小書(shū) Lesson20 - 更新階段的組件生命周期 本文作者:胡子大哈本文原文:http://huziketang.com/books/react...
摘要:本篇是深入系列的最后一篇,將介紹開(kāi)發(fā)應(yīng)用時(shí),經(jīng)常用到的模式,這些模式并非都有官方名稱(chēng),所以有些模式的命名并不一定準(zhǔn)確,請(qǐng)讀者主要關(guān)注模式的內(nèi)容。 React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深對(duì)React的理解,以及在項(xiàng)目中更加靈活地使用React。 本篇是React深入系列的最后一篇,將介紹開(kāi)發(fā)React應(yīng)用時(shí),經(jīng)常用到的模式,這些模式并非都有...
摘要:中的元素組件實(shí)例和節(jié)點(diǎn),是中關(guān)系密切的個(gè)概念,也是很容易讓初學(xué)者迷惑的個(gè)概念。組件和元素關(guān)系密切,組件最核心的作用是返回元素。只有組件實(shí)例化后,每一個(gè)組件實(shí)例才有了自己的和,才持有對(duì)它的節(jié)點(diǎn)和子組件實(shí)例的引用。 React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深對(duì)React的理解,以及在項(xiàng)目中更加靈活地使用React。 React 中的元素、組件、實(shí)...
閱讀 1305·2021-10-18 13:32
閱讀 2412·2021-09-24 09:47
閱讀 1360·2021-09-23 11:22
閱讀 2493·2019-08-30 14:06
閱讀 596·2019-08-30 12:48
閱讀 2033·2019-08-30 11:03
閱讀 565·2019-08-29 17:09
閱讀 2497·2019-08-29 14:10