iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 17
0
Modern Web

30天React從入門到入坑系列 第 17

DAY17:React state 同步,非同步??

  • 分享至 

  • xImage
  •  

react官網說明setState不一定同步,state為component封裝內部狀態屬性,當呼叫setState()就會重新繪製,所以由react自己透過diff進行控制state更新狀態。所以再操作state時需注意取值方式和時機,setState()可以透過第二參數callback來取到更新後的值,或在lifecycle componentDidUpdate當UI更新完後再取值,才不會發生state已更新但取到的值依然是舊值。

src/StateDiff.js

import React, { Component } from 'react';

class StateDiff extends React.Component {
  constructor(props) {
    super(props);
    this.state = { counter: 0 };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {    
    this.setState({
      counter: this.state.counter + 1
    },
    function(){
      console.log('handleClick_fn:'+this.state.counter);
    });
    console.log('handleClick:'+this.state.counter);
  }

  componentDidUpdate() {
    console.log('componentDidUpdate:'+this.state.counter);
  }

  render() {
    return <h1 onClick={this.handleClick}>{this.state.counter}</h1>;
  }
}

export default StateDiff;
src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import StateDiff from './StateDiff';
import registerServiceWorker from './registerServiceWorker';

ReactDOM.render(
  <StateDiff /> ,
  document.getElementById('root'));
registerServiceWorker();

輸出畫面(click觸發handleClick函數取到舊值0)
handleClick:0
componentDidUpdate:1
handleClick_fn:1
https://ithelp.ithome.com.tw/upload/images/20180104/20107317YBwFIIQK7I.png

參考資料
Component State
https://reactjs.org/docs/faq-state.html


上一篇
DAY16:React Error Boundaries
下一篇
DAY18:ajax fatch & react-axios
系列文
30天React從入門到入坑30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言