摘要:原生事件中的在按鈕原生事件中定義的和定時(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}
定時(shí)器中的setState上述執(zhí)行過(guò)程如下:
willmount中的setState會(huì)合并成一次執(zhí)行,count只會(huì)保留最后一次的設(shè)置,前面的放棄,所以willmount之后是1,并不是3;并且在render之前執(zhí)行,不會(huì)引起新的render
render之后執(zhí)行didMount,setState做同樣的處理,這是count是2,并且引起新的render
點(diǎn)擊按鈕,setState做同樣處理,count是3,引起新的render
定時(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); returnthis.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),在didMount中isBatchingUpdates始終是false,而事件調(diào)用觸發(fā)的setState,isBatchingUpdates則是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
摘要:首先賣個(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è)面所展示的東西按一定...
摘要:因?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)概念、特性和模式等,旨在幫助大家加深...
摘要:出現(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)化...
閱讀 2132·2021-11-19 09:58
閱讀 1719·2021-11-15 11:36
閱讀 2879·2019-08-30 15:54
閱讀 3399·2019-08-29 15:07
閱讀 2771·2019-08-26 11:47
閱讀 2825·2019-08-26 10:11
閱讀 2511·2019-08-23 18:22
閱讀 2759·2019-08-23 17:58