成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

深入理解react

CoderStudy / 1577人閱讀

摘要:最近在看源碼,發(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}

;

經(jīng)過(guò)babel解析后會(huì)變?yōu)閏reateElement(Test, {name: "world}),這里的Test就是上面的Test方法,name就是Test方法里面接受的props中的name。
實(shí)際上當(dāng)我們從開(kāi)始加載到渲染的時(shí)候做了下面幾步:

// 1. babel解析jsx
 -> 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();
key

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)該是,而不是App,這個(gè)也確實(shí)是我沒(méi)有好好看文檔。

setState

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

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)。

shouldComponentUpdate

當(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

相關(guān)文章

  • 深入理解Webpack核心模塊Tapable鉤子[同步版]

    摘要:本文將根據(jù)以下章節(jié)分別梳理每個(gè)鉤子同步鉤子首先安裝是簡(jiǎn)單的同步鉤子,它很類(lèi)似于發(fā)布訂閱。至此,我們把的所有同步鉤子都解析完畢異步鉤子比同步鉤子麻煩些,我們會(huì)在下一章節(jié)開(kāi)始解析異步的鉤子傳送門(mén)深入理解核心模塊鉤子異步版代碼 記錄下自己在前端路上爬坑的經(jīng)歷 加深印象,正文開(kāi)始~ tapable是webpack的核心依賴庫(kù) 想要讀懂webpack源碼 就必須首先熟悉tapableok.下面是...

    cangck_X 評(píng)論0 收藏0
  • React 深入系列1:React 中的元素、組件、實(shí)例和節(jié)點(diǎn)

    摘要:中的元素組件實(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的理解...

    techstay 評(píng)論0 收藏0
  • React.js 小書(shū) Lesson20 - 更新階段的組件生命周期

    摘要:所以對(duì)于組件更新階段的組件生命周期,我們簡(jiǎn)單提及并且提供一些資料給大家。這里為了知識(shí)的完整,補(bǔ)充關(guān)于更新階段的組件生命周期你可以通過(guò)這個(gè)方法控制組件是否重新渲染。大家對(duì)這更新階段的生命周期比較感興趣的話可以查看官網(wǎng)文檔。 React.js 小書(shū) Lesson20 - 更新階段的組件生命周期 本文作者:胡子大哈本文原文:http://huziketang.com/books/react...

    Yumenokanata 評(píng)論0 收藏0
  • React 深入系列7: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)常用到的模式,這些模式并非都有...

    Chao 評(píng)論0 收藏0
  • React 深入系列1:React 中的元素、組件、實(shí)例和節(jié)點(diǎn)

    摘要:中的元素組件實(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í)...

    LeviDing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<