清光犹为君 發表於 2019-7-10 20:00:00

react中setState用法

<h6> <span>setState()更新状态的2种写法</span></h6>
<ol>
<li><span>setState(updater, ),</span>
<span>      updater为返回stateChange对象的函数: (state, props) =&gt; stateChange</span>
<span>      接收的state和props被保证为最新的</span></li>
<li><span>setState(stateChange, )</span>
<span>      stateChange为对象,</span>
<span>      callback是可选的回调函数, 在状态更新且界面更新后才执行</span></li>
<li><span> 总结:</span>
<span>      对象方式是函数方式的简写方式</span>
<span>            如果新状态不依赖于原状态 ===&gt; 使用对象方式</span>
<span>            如果新状态依赖于原状态 ===&gt; 使用函数方式</span>
<span>      如果需要在setState()后获取最新的状态数据, 在第二个callback函数中读取</span></li>
</ol>
<h6> <span>setState()更新状态是异步还是同步的?</span></h6>
<ol>
<li><span>执行setState()的位置?</span>
<span>          在react控制的回调函数中: 生命周期勾子 / react事件监听回调</span>
<span>          非react控制的异步回调函数中: 定时器回调 / 原生事件监听回调 / promise回调</span></li>
<li><span> 异步 OR 同步?</span>
<span>          react相关回调中: 异步</span>
<span>          其它异步回调中: 同步</span></li>
</ol>
<h6> <span>关于异步的setState()</span></h6>
<ol>
<li><span>      多次调用, 如何处理?</span>
<span>          setState({}): 合并更新一次状态, 只调用一次render()更新界面 ---状态更新和界面更新都合并了</span>
<span>          setState(fn): 更新多次状态, 但只调用一次render()更新界面---状态更新没有合并, 但界面更新合并了</span></li>
<li><span>如何得到异步更新后的状态数据?</span>
<span>          在setState()的callback回调函数中 </span></li>
</ol>
<h6> <span>面试题</span></h6>
<pre><code class="language-html" lang="html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;03_setState()面试题&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
<p>&lt;div id="example"&gt;&lt;/div&gt;</p>
<p>&lt;script type="text/javascript" src="./js/react.development.js"&gt;&lt;/script&gt;<br>
&lt;script type="text/javascript" src="./js/react-dom.development.js"&gt;&lt;/script&gt;<br>
&lt;script type="text/javascript" src="./js/babel.min.js"&gt;&lt;/script&gt;</p>
<p>&lt;script type="text/babel"&gt;<br>
class StateTest extends React.Component {</p>
<pre><code>state = {
count: 0,
}

componentDidMount() {
this.setState({count: this.state.count + 1})
this.setState({count: this.state.count + 1})
console.log(this.state.count) // 2 ==&amp;gt; 0

this.setState(state =&amp;gt; ({count: state.count + 1}))
this.setState(state =&amp;gt; ({count: state.count + 1}))
console.log(this.state.count) // 3 ==&amp;gt; 0

setTimeout(() =&amp;gt; {
    this.setState({count: this.state.count + 1})
    console.log(&amp;#39;timeout&amp;#39;, this.state.count) // 10 ==&amp;gt; 6

    this.setState({count: this.state.count + 1})
    console.log(&amp;#39;timeout&amp;#39;, this.state.count) // 12 ==&amp;gt; 7
}, 0)

Promise.resolve().then(value =&amp;gt; {
    this.setState({count: this.state.count + 1})
    console.log(&amp;#39;promise&amp;#39;, this.state.count)// 6 ==&amp;gt;4

    this.setState({count: this.state.count + 1})
    console.log(&amp;#39;promise&amp;#39;, this.state.count) // 8 ==&amp;gt; 5
})
}

render() {
const count = this.state.count
console.log(&amp;#39;render&amp;#39;, count)// 1 ==&amp;gt; 0   4 ==&amp;gt;3   5 ==&amp;gt;47 ==&amp;gt;59 ==&amp;gt;611 ==&amp;gt;7
return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;{count}&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
)
}
</code></pre>
<p>}</p>
<p>ReactDOM.render(&lt;StateTest/&gt;, document.getElementById('example'))</p>
<p>&lt;/script&gt;<br>
&lt;/body&gt;<br>
&lt;/html&gt;</p>
</code><p><code class="language-html" lang="html"></code></p></pre><p></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/korea/p/11166168.html
頁: [1]
查看完整版本: react中setState用法