摘要:不保證的改變會(huì)立刻發(fā)生。所以,在我的這段代碼中顯然是異步的,因?yàn)槲覀儾荒茉诘母潞瘮?shù)中訪問變量。既然找到了原因,解決方法就有了不要在的更新函數(shù)中訪問變量或者如果不需要的話
今天使用React時(shí)遇到一個(gè)警告:
Warning: This synthetic event is reused for performance reasons. If you"re seeing this, you"re accessing the property target on a released/nullified synthetic event. This is set to null. If you must keep the original synthetic event around, use event.persist(). See https://fb.me/react-event-poo... for more information.
查看文檔解釋:
The SyntheticEvent is pooled. This means that the SyntheticEvent object will be reused and all properties will be nullified after the event callback has been invoked. This is for performance reasons. As such, you cannot access the event in an asynchronous way.SyntheticEvent 對(duì)象是通過合并得到的。 這意味著在事件回調(diào)被調(diào)用后,SyntheticEvent 對(duì)象將被重用并且所有屬性都將被取消。這是出于性能原因。因此,您無法以異步方式訪問該事件。
意思就是說我訪問event.target時(shí)處于異步操作中。我的代碼是:
handleTitleChange: React.ChangeEventHandler= (event) => { this.setState((prevState) => ({ collection: { title: event.target.value, content: prevState.content } })); }
看了很多遍沒發(fā)現(xiàn)哪里有異步操作,沒辦法只好加event.persist()先解決掉警告:
handleTitleChange: React.ChangeEventHandler= (event) => { event.persist(); this.setState((prevState) => ({ collection: { title: event.target.value, content: prevState.content } })); }
但是,我突然回想起setState并不保證是同步的:
Think of setState() as a request rather than an immediate command to update the component. For better perceived performance, React may delay it, and then update several components in a single pass. React does not guarantee that the state changes are applied immediately.
setState() does not always immediately update the component. It may batch or defer the update until later.把setState當(dāng)作是請(qǐng)求更新組件,而不是立即更新組件。為了性能,React會(huì)延遲更新,會(huì)把多個(gè)組件的更新放在一次操作里。React不保證state的改變會(huì)立刻發(fā)生。
setState并不總是立即更新組件。它可能會(huì)推后至批量更新。
所以,在我的這段代碼中顯然setState是異步的,因?yàn)镋vent Polling我們不能在setState的更新函數(shù)中訪問event變量。既然找到了原因,解決方法就有了:
不要在setState的更新函數(shù)中訪問event變量:
handleTitleChange: React.ChangeEventHandler= (event) => { const val = event.target.value; this.setState((prevState) => ({ collection: { title: val, content: prevState.content } })); }
或者如果不需要prevState的話:
handleTitleChange: React.ChangeEventHandler= (event) => { this.setState({ collection: { title: event.target.value, content: this.state.content } }); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/90038.html
摘要:如果你使用實(shí)驗(yàn)性屬性初始化語法,你能用這方法來正確綁定回調(diào)函數(shù)的綁定這語法在中默認(rèn)支持。然而,如果這回調(diào)函數(shù)是作為一個(gè)傳遞到更下一級(jí)的組件中的時(shí)候,些組件可能會(huì)做一個(gè)額外的重新渲染。 下面是react官方文檔的個(gè)人翻譯,如有翻譯錯(cuò)誤,請(qǐng)多多指出原文地址:https://facebook.github.io/re... Handling events with React element...
摘要:前提最近通過閱讀官方文檔的事件模塊,有了一些思考和收獲,在這里記錄一下調(diào)用方法時(shí)需要手動(dòng)綁定先從一段官方代碼看起代碼中的注釋提到了一句話的綁定是必須的,其實(shí)這一塊是比較容易理解的,因?yàn)檫@并不是的一個(gè)特殊點(diǎn),而是這門語言的特性。 前提 最近通過閱讀React官方文檔的事件模塊,有了一些思考和收獲,在這里記錄一下~ 調(diào)用方法時(shí)需要手動(dòng)綁定this 先從一段官方代碼看起: showImg(...
摘要:系列系列簡(jiǎn)單模擬語法一系列合成事件與二系列算法實(shí)現(xiàn)分析三系列從到再到四系列與部分源碼解析五系列從使用了解的各種使用方案六的誕生他是的一種擴(kuò)展語法。這個(gè)函數(shù)接受組件的實(shí)例或元素作為參數(shù),以存儲(chǔ)它們并使它們能被其他地方訪問。 React系列 React系列 --- 簡(jiǎn)單模擬語法(一)React系列 --- Jsx, 合成事件與Refs(二)React系列 --- virtualdom di...
摘要:關(guān)于在計(jì)算機(jī)領(lǐng)域是一個(gè)很普遍的概念,中文通常翻譯為代理,代理一般用于描述某人或某事代表他人行事。常見的概念有代理服務(wù)器反向代理代理模式等。所以至少可以起到兩方面的作用進(jìn)行訪問控制和增加功能。理解了上面兩個(gè)問題,學(xué)習(xí)的就簡(jiǎn)單多了。 關(guān)于Proxy Proxy在計(jì)算機(jī)領(lǐng)域是一個(gè)很普遍的概念,中文通常翻譯為代理,代理一般用于描述某人或某事代表他人行事。常見的概念有Proxy Server(代...
摘要:還是先來一段官方的基礎(chǔ)使用案例,熟悉一下整體的代碼流程中使用了端常用到的等一些常用組件,作為的頂層組件來獲取的和設(shè)置回調(diào)函數(shù)來更新。 react-router是react官方推薦并參與維護(hù)的一個(gè)路由庫,支持瀏覽器端、app端、服務(wù)端等常見場(chǎng)景下的路由切換功能,react-router本身不具備切換和跳轉(zhuǎn)路由的功能,這些功能全部由react-router依賴的history庫完成,his...
閱讀 1125·2021-11-25 09:43
閱讀 1647·2021-09-13 10:25
閱讀 2610·2021-09-09 11:38
閱讀 3414·2021-09-07 10:14
閱讀 1725·2019-08-30 15:52
閱讀 647·2019-08-30 15:44
閱讀 3584·2019-08-29 13:23
閱讀 1980·2019-08-26 13:33