剛剛 發表於 2019-12-18 23:20:00

React中setState学习总结

<p>react中setState方法到底是异步还是同步,其实这个是分在什么<strong>条件</strong>下是异步或者同步。</p>
<p>1.先来回顾一下react组件中改变state的几种方式:</p>
<div class="cnblogs_code">
<pre>import React, { Component } from 'react'<span style="color: rgba(0, 0, 0, 1)">

class Index extends Component {
    state</span>=<span style="color: rgba(0, 0, 0, 1)">{
      count:</span>1<span style="color: rgba(0, 0, 0, 1)">
    }
    test1 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过回调函数的形式</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
            count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
      }));
      console.log(</span>'test1 setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
    }
    test2 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过对象的方式(注意:此方法多次设置会合并且只调用一次!)</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            count:</span><span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">
      });
      console.log(</span>'test2 setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
    }
    test3 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不能直接修改state的值,此方法强烈不建议!!!因为不会触发重新render</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.state.count += 1<span style="color: rgba(0, 0, 0, 1)">;
    }
    test4 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在第二个callback拿到更新后的state</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            count:</span><span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">
      },()</span>=&gt;{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在状态更新且页面更新(render)后执行</span>
            console.log('test4 setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      });
    }
    render() {
      console.log(</span>'render'<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;div&gt;
                &lt;h1&gt;currentState:{<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count}&lt;/h1&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.test1}&gt;测试1&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.test2}&gt;测试2&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.test3} style={{color:'red'}}&gt;测试3&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.test4}&gt;测试4&lt;/button&gt;
            &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">      )
    }
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Index;</pre>
</div>
<p>2.setState()更新状态是异步还是同步:</p>
<p><strong>需要判断执行setState的位置</strong></p>
<p><strong>异步:</strong>在react控制的回调函数中:生命周期钩子/react事件监听回调</p>
<div class="cnblogs_code">
<pre>import React, { Component } from 'react'<span style="color: rgba(0, 0, 0, 1)">

class Index extends Component {
    state</span>=<span style="color: rgba(0, 0, 0, 1)">{
      count:</span>1<span style="color: rgba(0, 0, 0, 1)">
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    react事件监听回调中,setState()是异步状态
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    update1 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      console.log(</span>'update1 setState()之前',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
            count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
      }));
      console.log(</span>'update1 setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    react生命周期钩子中,setState()是异步更新状态
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    componentDidMount() {
      console.log(</span>'componentDidMount setState()之前',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
            count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
      }));
      console.log(</span>'componentDidMount setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
    }
   
    render() {
      console.log(</span>'render'<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;div&gt;
                &lt;h1&gt;currentState:{<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count}&lt;/h1&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update1}&gt;测试1&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update2}&gt;测试2&lt;/button&gt;
            &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">      )
    }
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Index;</pre>
</div>
<p><strong>同步:</strong>非react控制的异步回调函数中:定时器回调/原生事件监听回调/Promise</p>
<div class="cnblogs_code">
<pre>import React, { Component } from 'react'<span style="color: rgba(0, 0, 0, 1)">

class Index extends Component {
    state</span>=<span style="color: rgba(0, 0, 0, 1)">{
      count:</span>1<span style="color: rgba(0, 0, 0, 1)">
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    定时器回调
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    update1 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      setTimeout(()</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{
            console.log(</span>'setTimeout setState()之前',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1</span>
            <span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
                count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
            }));
            console.log(</span>'setTimeout setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2</span>
<span style="color: rgba(0, 0, 0, 1)">      });
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    原生事件回调
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    update2 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const h1 </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.refs.count;
      h1.onclick </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            console.log(</span>'onClick setState()之前',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1</span>
            <span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
                count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
            }));
            console.log(</span>'onClick setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2</span>
<span style="color: rgba(0, 0, 0, 1)">      }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    Promise回调
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    update3 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      Promise.resolve().then(value</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{
            console.log(</span>'Promise setState()之前',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1</span>
            <span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
                count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
            }));
            console.log(</span>'Promise setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2</span>
<span style="color: rgba(0, 0, 0, 1)">      });
    }
   
    render() {
      console.log(</span>'render'<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;div&gt;
                &lt;h1 ref='count'&gt;currentState:{<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count}&lt;/h1&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update1}&gt;测试1&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update2}&gt;测试2&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update3}&gt;测试3&lt;/button&gt;
            &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">      )
    }
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Index;</pre>
</div>
<p>3.setState()多次调用的问题:</p>
<p><strong>异步的setState()</strong></p>
<p>(1)多次调用,处理方法:</p>
<p>setState({}):合并更新一次状态,只调用一次render()更新界面,多次调用会合并为一个,后面的值会覆盖前面的值。</p>
<p>setState(fn):更新多次状态,只调用一次render()更新界面,多次调用<strong>不会</strong>合并为一个,后面的值会覆盖前面的值。</p>
<div class="cnblogs_code">
<pre>import React, { Component } from 'react'<span style="color: rgba(0, 0, 0, 1)">

class Index extends Component {
    state</span>=<span style="color: rgba(0, 0, 0, 1)">{
      count:</span>1<span style="color: rgba(0, 0, 0, 1)">
    }
    update1 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      console.log(</span>'update1 setState()之前',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
            count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
      }));
      console.log(</span>'update1 setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      console.log(</span>'update1 setState()之前2',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
            count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
      }));
      console.log(</span>'update1 setState()之后2',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
    }
    update2 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      console.log(</span>'update2 setState()之前',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            count:</span><span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">
      });
      console.log(</span>'update2 setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      console.log(</span>'update2 setState()之前2',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            count:</span><span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">
      });
      console.log(</span>'update2 setState()之后2',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
    }
    update3 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      console.log(</span>'update3 setState()之前',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            count:</span><span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">
      });
      console.log(</span>'update3 setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      console.log(</span>'update3 setState()之前2',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
            count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
      }));</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这里需要注意setState传参为函数模式时,state会确保拿到的是最新的值</span>
      console.log('update3 setState()之后2',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
    }
    update4 </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      console.log(</span>'update4 setState()之前',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState((state,props)=&gt;<span style="color: rgba(0, 0, 0, 1)">({
            count:state.count</span>+1<span style="color: rgba(0, 0, 0, 1)">
      }));
      console.log(</span>'update4 setState()之后',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      console.log(</span>'update4 setState()之前2',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            count:</span><span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">
      });</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这里需要注意的是如果setState传参为对象且在最后,那么会与之前的setState合并</span>
      console.log('update4 setState()之后2',<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state.count);
    }
    render() {
      console.log(</span>'render'<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;div&gt;
                &lt;h1&gt;currentState:{<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count}&lt;/h1&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update1}&gt;测试1&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update2}&gt;测试2&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update3}&gt;测试3&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update4}&gt;测试4&lt;/button&gt;
            &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">      )
    }
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Index;</pre>
</div>
<p>(2)如何得到setState异步更新后的状态数据:</p>
<p>在setState()的callback回调函数中</p>
<p>4.react中常见的setState面试题(setState执行顺序)</p>
<div class="cnblogs_code">
<pre>import React, { Component } from 'react'
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> setState执行顺序</span>
<span style="color: rgba(0, 0, 0, 1)">class Index extends Component {
    state</span>=<span style="color: rgba(0, 0, 0, 1)">{
      count:</span>0<span style="color: rgba(0, 0, 0, 1)">
    }
    componentDidMount() {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState({count:<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">});
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState({count:<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">});
      console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2 =&gt; 0</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.setState(state=&gt;({count:state.count+1<span style="color: rgba(0, 0, 0, 1)">}));
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState(state=&gt;({count:state.count+1<span style="color: rgba(0, 0, 0, 1)">}));
      console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 3 =&gt; 0</span>
      setTimeout(() =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState({count:<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">});
            console.log(</span>'setTimeout',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 10 =&gt; 6</span>
            <span style="color: rgba(0, 0, 255, 1)">this</span>.setState({count:<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">});
            console.log(</span>'setTimeout',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 12 =&gt; 7</span>
<span style="color: rgba(0, 0, 0, 1)">      });
      Promise.resolve().then(value</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.setState({count:<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">});
            console.log(</span>'Promise',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 6 =&gt; 4</span>
            <span style="color: rgba(0, 0, 255, 1)">this</span>.setState({count:<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count+1<span style="color: rgba(0, 0, 0, 1)">});
            console.log(</span>'Promise',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 8 =&gt; 5</span>
<span style="color: rgba(0, 0, 0, 1)">      });
    }
    render() {
      console.log(</span>'render',<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1 =&gt; 0// 4 =&gt; 3 // 5 =&gt; 4 // 7 =&gt; 5 // 9 =&gt; 6 // 11 =&gt; 7</span>
      <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;div&gt;
                &lt;h1&gt;currentState:{<span style="color: rgba(0, 0, 255, 1)">this</span>.state.count}&lt;/h1&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update1}&gt;测试1&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update2}&gt;测试2&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update3}&gt;测试3&lt;/button&gt;
                &lt;button onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.update4}&gt;测试4&lt;/button&gt;
            &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">      )
    }
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Index;</pre>
</div>
<p><strong>总结:react中setState()更新状态的2种写法</strong></p>
<p>1)setState(updater,)</p>
<p>updater:为返回stateChange对象的函数:(state,props)=&gt;stateChange,接收的<strong>state和props都保证为最新</strong>的</p>
<p>2)setState(stateChange,)</p>
<p>stateChange为对象,callback是可选的回调函数,在<strong>状态更新且界面更新</strong>后才执行</p>
<p><strong>注意:</strong></p>
<p><strong>对象是函数方式的简写方式</strong></p>
<p>如果新状态不依赖于原状态,则使用对象方式;</p>
<p>如果新状态依赖于原状态,则使用函数方式;</p>
<p>如果需要在setState()后获取最新的状态数据,在第二个callback函数中获取</p><br><br>
来源:https://www.cnblogs.com/abc-x/p/12051364.html
頁: [1]
查看完整版本: React中setState学习总结