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

資訊專欄INFORMATION COLUMN

React中setState幾個(gè)現(xiàn)象---先知道再理解

tomlingtm / 3520人閱讀

摘要:原生事件中的在按鈕原生事件中定義的和定時(shí)器效果一樣,每次都會(huì)引起新的事件是合并的成一次的。原生事件事件生成計(jì)時(shí)器點(diǎn)擊按鈕,先執(zhí)行原生事件,再執(zhí)行事件,但是原生事件會(huì)觸發(fā)兩次,事件觸發(fā)一次。

常規(guī)情況

在同一個(gè)方法中多次setState是會(huì)被合并的,并且對(duì)相同屬性的設(shè)置只保留最后一次的設(shè)置;

import React from "react";

export class Test extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            count: 0
            
        };
    }
    componentWillMount() {
        let me = this;
        me.setState({
            count: me.state.count + 2
        });
        me.setState({
            count: me.state.count + 1
        });
    }
    componentDidMount() {
        let me = this;
        me.setState({
            count: me.state.count + 2
        });
        me.setState({
            count: me.state.count + 1
        });
    }

    onClick() {
        let me = this;
        me.setState({
            count: me.state.count + 1
        });
        me.setState({
            count: me.state.count + 1
        });
    }

    render() {
        console.log(this.state.count);
        console.log("1111111111111111111111111111111111111111111");
        return (
            

{this.state.count}



) } }

上述執(zhí)行過(guò)程如下:

willmount中的setState會(huì)合并成一次執(zhí)行,count只會(huì)保留最后一次的設(shè)置,前面的放棄,所以willmount之后是1,并不是3;并且在render之前執(zhí)行,不會(huì)引起新的render

render之后執(zhí)行didMount,setState做同樣的處理,這是count2,并且引起新的render

點(diǎn)擊按鈕,setState做同樣處理,count3,引起新的render

定時(shí)器中的setState

定時(shí)器中的setState,每次都會(huì)引起新的render,即使是同一個(gè)定時(shí)器中的多次setState

代碼更改成如下:

    componentWillMount() {
        let me = this;
        setTimeout(() => {
            me.setState({
                count: me.state.count + 1
            });
            me.setState({
                count: me.state.count + 1
            });
        }, 0);
    }
    
       componentDidMount() {
        let me = this;
        setTimeout(() => {
            me.setState({
                count: me.state.count + 1
            });
            me.setState({
                count: me.state.count + 1
            });
        }, 0);
    }
    
    onClickTime() {
        let me = this;
        setTimeout(() => {
            me.setState({
                count: me.state.count + 1
            });
            me.setState({
                count: me.state.count + 1
            });
        }, 0);
    }
上述代碼,每次setState都會(huì)引發(fā)新的render,需要深入了解的可以查查setState的原理,簡(jiǎn)單理解是定時(shí)器中的setState沒(méi)走react的事物機(jī)制,執(zhí)行時(shí)批量更新沒(méi)被設(shè)置true,所以每次都直接render了。
原生事件中的setState
在按鈕原生事件中定義的setState,和定時(shí)器效果一樣,每次setState都會(huì)引起新的render
react事件是合并的成一次render的。
 componentDidMount() {
        this.button.addEventListener("click", this.onClick.bind(this, "原生事件"), false);
 }
    
 onClick(info) {
        console.log(info);
        this.setState({
            count: ++count
        });
        this.setState({
            count: ++count
        });
    }

    render() {
        console.log(this.state.count);
        return 
this.button = input} onClick={this.onClick.bind(this, "React事件")} value="生成計(jì)時(shí)器" />
Count:{this.state.count}
}
點(diǎn)擊按鈕,先執(zhí)行原生事件,再執(zhí)行react事件,但是原生事件會(huì)觸發(fā)兩次render,react事件觸發(fā)一次。
總結(jié)

上述是我對(duì)setState的理解,拋磚引玉,希望幫助大家有方向的去了解react原理機(jī)制。剛開(kāi)始接觸,很多同學(xué)想深入了解,但可能不知道從何入手,這也是我遇到過(guò)的困擾,所以現(xiàn)在分享出來(lái),希望能幫助大家少走彎路,更快的、更有準(zhǔn)針對(duì)性的去研究學(xué)習(xí)React。

以下為補(bǔ)充內(nèi)容

回調(diào)不會(huì)觸發(fā)react的批量更新機(jī)制

其實(shí)在回調(diào)函數(shù)中,setState是不會(huì)觸發(fā)批量更新機(jī)制的,無(wú)論是promise,ajax,setTimeout回調(diào)等等,同時(shí)設(shè)置多次setState,每個(gè)setState都會(huì)多帶帶執(zhí)行并render,因?yàn)樯舷挛陌l(fā)生了變化。

下面是驗(yàn)證code

  onClickBtn = () => {
    // const promise = new Promise((resolve, reject) => {
    //   this.setState({ count: this.state.count + 1 });
    //   console.log(this.state.count);
    //   this.setState({ count: this.state.count + 1 });
    //   console.log(this.state.count);
    //   resolve();
    // });

    // promise.then(() => {
    //   this.setState({ count: this.state.count + 1 });
    //   console.log(this.state.count);
    //   this.setState({ count: this.state.count + 1 });
    //   console.log(this.state.count);
    // });

    fetch("/api/getlist")
      .then(response => {
        return response.json();
      })
      .then(data => {
        console.log(JSON.stringify(data));
        this.setState({ count: this.state.count + 1 });
        console.log(this.state.count);
        this.setState({ count: this.state.count + 1 });
        console.log(this.state.count);
      });
  };
生命周期和事件中多次setState的區(qū)別

在寫demo時(shí)發(fā)現(xiàn),雖然didMount中的多次setState會(huì)被合并,符合正常的規(guī)律,但是通過(guò)調(diào)試發(fā)現(xiàn),在didMountisBatchingUpdates始終是false,而事件調(diào)用觸發(fā)的setStateisBatchingUpdates則是true。

---------------------轉(zhuǎn)載請(qǐng)標(biāo)明出處!--------------------

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94451.html

相關(guān)文章

  • [ 一起學(xué)React系列 -- 2 ] UI的靈魂--State

    摘要:首先賣個(gè)關(guān)子,下面我們一起來(lái)復(fù)習(xí)下小學(xué)還是初中的一枚數(shù)學(xué)知識(shí)。一旦更改了,會(huì)觸發(fā)組件的重新渲染。為了頁(yè)面渲染性能的考慮,有助于在中進(jìn)行比較并確定是否重新渲染。 概念引入 對(duì)于React來(lái)說(shuō), 沒(méi)有State就沒(méi)有頁(yè)面的渲染, 我們也將什么都看不到 咋一聽(tīng)怎么那么唬人?不過(guò)的確是這樣,正如標(biāo)題所言State是UI的靈魂。我們都知道React的核心思想之一是組件化,將頁(yè)面所展示的東西按一定...

    XBaron 評(píng)論0 收藏0
  • React 深入系列4:組件的生命周期

    摘要:因?yàn)槭巧钊胂盗形恼?,本文不?huì)仔細(xì)介紹每個(gè)生命周期方法的使用,而是會(huì)重點(diǎn)講解在使用組件生命周期時(shí),經(jīng)常遇到的疑問(wèn)和錯(cuò)誤使用方式。父組件發(fā)生更新導(dǎo)致的組件更新,生命周期方法的調(diào)用情況同上所述。 文:徐超,《React進(jìn)階之路》作者授權(quán)發(fā)布,轉(zhuǎn)載請(qǐng)注明作者及出處 React 深入系列4:組件的生命周期 React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深...

    warnerwu 評(píng)論0 收藏0
  • 記錄一次利用Timeline Performance工具進(jìn)行 React性能優(yōu)化的真實(shí)案例

    摘要:出現(xiàn)紅幀表示頁(yè)面已經(jīng)超負(fù)荷,會(huì)出現(xiàn)卡頓,響應(yīng)緩慢等現(xiàn)象。因此當(dāng)滑動(dòng)周日歷時(shí)已經(jīng)不會(huì)有紅幀發(fā)生了。我的目的是每一次遞歸會(huì)調(diào)用一次與但是這樣寫只會(huì)在遞歸結(jié)束時(shí)調(diào)用一次因此修改如下這樣優(yōu)化之后,發(fā)現(xiàn)內(nèi)存占用下降一些,但是紅幀仍然存在。 性能優(yōu)化可以說(shuō)是衡量一個(gè)前端程序員react使用水平的重要標(biāo)準(zhǔn)。 在學(xué)習(xí)react之初的時(shí)候,由于對(duì)react不夠了解,寫的項(xiàng)目雖然功能都實(shí)現(xiàn)了,但是性能優(yōu)化...

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

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

0條評(píng)論

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