国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

React中setState同步更新策略

開發(fā) 開發(fā)工具
我們在上文中提及,為了提高性能React將setState設置為批次更新,即是異步操作函數(shù),并不能以順序控制流的方式設置某些事件,我們也不能依賴于this.state來計算未來狀態(tài)。

setState 同步更新

我們在上文中提及,為了提高性能React將setState設置為批次更新,即是異步操作函數(shù),并不能以順序控制流的方式設置某些事件,我們也不能依賴于this.state來計算未來狀態(tài)。典型的譬如我們希望在從服務端抓取數(shù)據(jù)并且渲染到界面之后,再隱藏加載進度條或者外部加載提示:

  1. componentDidMount() { 
  2.     fetch('https://example.com'
  3.         .then((res) => res.json()) 
  4.         .then
  5.             (something) => { 
  6.                 this.setState({ something }); 
  7.                 StatusBar.setNetworkActivityIndicatorVisible(false); 
  8.             } 
  9.         ); 

因為setState函數(shù)并不會阻塞等待狀態(tài)更新完畢,因此setNetworkActivityIndicatorVisible有可能先于數(shù)據(jù)渲染完畢就執(zhí)行。我們可以選擇在componentWillUpdate與componentDidUpdate這兩個生命周期的回調(diào)函數(shù)中執(zhí)行setNetworkActivityIndicatorVisible,但是會讓代碼變得破碎,可讀性也不好。實際上在項目開發(fā)中我們更頻繁遇見此類問題的場景是以某個變量控制元素可見性:

  1. this.setState({showForm : !this.state.showForm}); 

我們預期的效果是每次事件觸發(fā)后改變表單的可見性,但是在大型應用程序中如果事件的觸發(fā)速度快于setState的更新速度,那么我們的值計算完全就是錯的。本節(jié)就是討論兩種方式來保證setState的同步更新。

完成回調(diào)

setState函數(shù)的第二個參數(shù)允許傳入回調(diào)函數(shù),在狀態(tài)更新完畢后進行調(diào)用,譬如:

  1. this.setState({ 
  2.      load: !this.state.load
  3.      count: this.state.count + 1 
  4.    }, () => { 
  5.      console.log(this.state.count); 
  6.      console.log('加載完成'
  7.    }); 

這里的回調(diào)函數(shù)用法相信大家很熟悉,就是JavaScript異步編程相關(guān)知識,我們可以引入Promise來封裝setState:

  1. setStateAsync(state) { 
  2.     return new Promise((resolve) => { 
  3.       this.setState(state, resolve) 
  4.     }); 
  5.   } 

setStateAsync 返回的是Promise對象,在調(diào)用時我們可以使用Async/Await語法來優(yōu)化代碼風格:

  1. async componentDidMount() { 
  2.    StatusBar.setNetworkActivityIndicatorVisible(true
  3.    const res = await fetch('https://api.ipify.org?format=json'
  4.    const {ip} = await res.json() 
  5.    await this.setStateAsync({ipAddress: ip}) 
  6.    StatusBar.setNetworkActivityIndicatorVisible(false
  7.  } 

這里我們就可以保證在setState渲染完畢之后調(diào)用外部狀態(tài)欄將網(wǎng)絡請求狀態(tài)修改為已結(jié)束,整個組件的完整定義為:

  1. class AwesomeProject extends Component { 
  2.   state = {} 
  3.   setStateAsync(state) { 
  4.     ... 
  5.   } 
  6.   async componentDidMount() { 
  7.    ... 
  8.   } 
  9.   render() { 
  10.     return ( 
  11.       <View style={styles.container}> 
  12.         <Text style={styles.welcome}> 
  13.           My IP is {this.state.ipAddress || 'Unknown'
  14.         </Text> 
  15.       </View
  16.     ); 
  17.   } 

傳入狀態(tài)計算函數(shù)

除了使用回調(diào)函數(shù)的方式監(jiān)聽狀態(tài)更新結(jié)果之外,React還允許我們傳入某個狀態(tài)計算函數(shù)而不是對象來作為***個參數(shù)。狀態(tài)計算函數(shù)能夠為我們提供可信賴的組件的State與Props值,即會自動地將我們的狀態(tài)更新操作添加到隊列中并等待前面的更新完畢后傳入***的狀態(tài)值:

  1. this.setState(function(prevState, props){  
  2. return {showForm: !prevState.showForm}  
  3. }); 

這里我們以簡單的計數(shù)器為例,我們希望用戶點擊按鈕之后將計數(shù)值連加兩次,基本的組件為:

  1. class Counter extends React.Component{ 
  2.   constructor(props){ 
  3.     super(props); 
  4.     this.state = {count : 0}  
  5.     this.incrementCount = this.incrementCount.bind(this) 
  6.   } 
  7.   incrementCount(){ 
  8.     ... 
  9.   } 
  10.   render(){ 
  11.     return <div> 
  12.               <button onClick={this.incrementCount}>Increment</button> 
  13.               <div>{this.state.count}</div> 
  14.           </div> 
  15.   } 

直觀的寫法我們可以連續(xù)調(diào)用兩次setState函數(shù),這邊的用法可能看起來有點怪異,不過更多的是為了說明異步更新帶來的數(shù)據(jù)不可預測問題。

  1. incrementCount(){ 
  2.    this.setState({count : this.state.count + 1})  
  3.    this.setState({count : this.state.count + 1}) 
  4.  } 

上述代碼的效果是每次點擊之后計數(shù)值只會加1,實際上第二個setState并沒有等待***個setState執(zhí)行完畢就開始執(zhí)行了,因此其依賴的當前計數(shù)值完全是錯的。我們當然可以使用上文提及的setStateAsync來進行同步控制,不過這里我們使用狀態(tài)計算函數(shù)來保證同步性:

  1. incrementCount(){ 
  2.   this.setState((prevState, props) => ({ 
  3.      count: prevState.count + 1 
  4.    })); 
  5.   this.setState((prevState, props) => ({ 
  6.      count: prevState.count + 1 
  7.    })); 
  8.  } 

這里的第二個setState傳入的prevState值就是***個setState執(zhí)行完畢之后的計數(shù)值,也順利保證了連續(xù)自增兩次。

【本文是51CTO專欄作者“張梓雄 ”的原創(chuàng)文章,如需轉(zhuǎn)載請通過51CTO與作者聯(lián)系】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2022-06-13 06:20:42

setStatereact18

2020-02-10 09:35:18

數(shù)據(jù)中心服務器技術(shù)

2011-11-04 14:07:20

微軟Hotmail策略

2024-12-03 10:59:36

2018-10-24 14:30:30

緩存服務更新

2018-10-19 11:07:02

主流緩存更新

2024-05-10 08:12:12

React同步更新useState

2025-06-12 09:16:54

2021-06-29 09:47:34

ReactSetState機制

2023-04-13 08:15:47

Redis緩存一致性

2012-02-01 10:29:13

2021-08-03 07:40:47

宏任務微任務React

2009-10-30 09:19:43

2009-03-09 18:46:11

Windows phoWindows Mob

2018-06-21 11:27:06

Windows 7更新停止

2022-01-25 00:08:08

Windows 10Windows 11微軟

2015-10-30 09:33:48

ChromeAndroid合一

2010-11-11 14:36:17

MySQL

2012-11-21 09:34:58

SaaS應用SaaS應用集成軟件集成

2025-05-19 09:05:17

點贊
收藏

51CTO技術(shù)棧公眾號

精品av一区二区| 亚洲一区二区三区四区五区黄 | 亚洲欧美国产不卡| 91亚洲人成网污www| 久久男人资源视频| 91桃色在线观看| 精品女同一区二区三区在线播放| 欧美婷婷精品激情| 不卡免费追剧大全电视剧网站| 一区二区在线高清视频| 国产农村妇女毛片精品久久莱园子 | 精品国产乱码久久久久久夜甘婷婷| 亚洲免费av一区二区| 亚洲综合丁香婷婷六月香| 天堂中文视频在线| 国产网红主播福利一区二区| wwwwww欧美| 国产精品一区二区在线播放 | 伊人久久综合网另类网站| 亚洲天天在线日亚洲洲精| 97超碰资源站在线观看| 欧美专区日韩专区| bbbbbbbbbbb在线视频| 在线视频国内自拍亚洲视频| 污污网址在线观看| 色丁香久综合在线久综合在线观看| 在线视频资源站| 制服丝袜亚洲播放| 亚洲女同av| 九九热这里只有在线精品视| 久久动漫网址| caoporn国产精品免费公开| 中文精品在线| 久久久天堂国产精品| 久久久久久久久97黄色工厂| 成人漫画网站免费| 午夜精品福利久久久| 国产三级在线| 亚洲精品理论电影| 我要色综合中文字幕| 国产精品欧美日韩一区二区| 欧美精品国产| 欧美少妇一区二区三区| 日本一区二区免费在线| 尤物免费看在线视频| 91精品国产福利在线观看| 不卡av免费观看| 欧美xxxx做受欧美| 日韩高清欧美| 日韩av电影免费观看| 国产精品456| 米奇在线777| 精品盗摄一区二区三区| julia中文字幕一区二区99在线| 国产精品爽爽爽爽爽爽在线观看| 巨乳诱惑日韩免费av| 日韩欧美视频网站| 亚洲国产一区二区在线播放| 宅男在线观看免费高清网站| 中文字幕9999| 97欧美在线视频| 亚洲一区在线直播| 国产精品久久久久久久岛一牛影视| 可以在线观看的av网站| 亚洲色图激情小说| 最新国产精品视频| 欧美激情导航| 国产精品色在线观看| 无遮挡动作视频在线观看免费入口| 伊人激情综合网| 日韩欧美网址| 欧美精品一区二区三区三州| 亚洲成人免费在线观看| 制服丝袜专区在线| 成人精品视频99在线观看免费 | 五月天激情在线| 欧美精品电影在线| 久久婷婷亚洲| 国产高潮av| 亚洲毛片在线免费观看| 精品香蕉视频| 亚洲精品少妇一区二区| 色婷婷亚洲婷婷| 高清日韩欧美| 中文精品一区二区三区| 亚洲3atv精品一区二区三区| 美女色狠狠久久| 97碰碰视频| 国产精品乱码一区二三区小蝌蚪| 国产黄色在线观看| 欧洲成人免费视频| 国产成人三级在线观看| 丁香在线视频| 奇米4444一区二区三区| 大桥未久av一区二区三区中文| www日韩tube| 日本国产一区二区三区| 国产成人综合在线观看| 黄色片免费在线| 欧美孕妇毛茸茸xxxx| 成人精品小蝌蚪| 免费网站在线观看人| 亚洲精品欧美极品| 亚洲国产日韩综合久久精品| 日韩精品中文字幕一区二区| 日韩欧美第二区在线观看| 亚洲成国产人片在线观看| 国产精品中文字幕制服诱惑| 成人黄色大片网站| 日韩精品视频在线播放| 亚洲一区成人| 午夜毛片在线| 超碰97在线人人| 精品久久久久久久久久| 九九亚洲精品| 四虎国产精品成人免费4hu| 日韩一区二区三区在线播放| 精品亚洲国产成人av制服丝袜| 精精国产xxxx视频在线| 国产精品免费看一区二区三区| 亚洲不卡一区二区三区| 国产一区二区三区91| 浪潮av在线| 日韩av男人的天堂| 国产精品久久午夜| 中文字幕一区图| 免费观看成人在线视频| 中文字幕亚洲图片| 粉嫩一区二区三区性色av| 亚洲人成午夜免电影费观看| 亚洲成人一区二区三区| 欧美va天堂va视频va在线| 麻豆精品网站| 欧美hdxxxxx| 日本精品免费视频| 亚洲欧美中文在线视频| 国产suv精品一区二区6| 日韩高清成人| 国产 福利 在线| www.亚洲一区| 中文字幕乱码久久午夜不卡| 一区二区三区四区视频免费观看| 粉嫩虎白女毛片人体| 久久免费视频网站| 亚洲在线观看免费视频| 午夜久久福利| www.综合网.com| 青娱乐自拍偷拍| 97香蕉超级碰碰久久免费的优势| 亚洲另类在线一区| 亚洲一区欧美| 亚洲wwwww| avove在线观看| 久久精品小视频| 亚洲日本va在线观看| 99久久婷婷| 四虎亚洲精品| 欧美私人情侣网站| 国色天香久久精品国产一区| 亚洲第一二区| 国产精品综合久久| 日韩av一区二区在线| 久久riav| 和岳每晚弄的高潮嗷嗷叫视频| 欧美少妇性生活视频| 亚洲国产另类 国产精品国产免费| 成人不卡视频| 午夜看片在线免费| 国产日本视频| 欧美色18zzzzxxxxx| 少女频道在线观看高清 | 91国偷自产一区二区三区的观看方式| 日本大胆人体视频| 在线男人天堂| 国产极品模特精品一二| 99在线热播精品免费| 亚洲欧美另类人妖| 欧美日韩国产成人| 鲁丝片一区二区三区| 国内精品二区| 人人妻人人澡人人爽欧美一区| 最新av在线免费观看| 五月天网站亚洲| 黄色99视频| 黄色一级大片在线观看| 91精品推荐| 原纱央莉成人av片| 精品国产精品国产偷麻豆| 亚洲第一影院| 国产精品久久久久9999高清| 亚洲国语精品自产拍在线观看| 天天爽人人爽夜夜爽| 一个人看的免费视频色| av在线电影院| 亚洲精品**不卡在线播he| 国产精品一级黄| 亚洲图片欧美视频| 欧美日本国产一区| 久久视频在线直播| 国产男女猛烈无遮挡91|