react の setState メソッドは非同期か同期ですか? 実際、これは非同期か同期かという 条件 によって異なります。
1. まず、反応コンポーネントの状態を変更するいくつかの方法を確認しましょう:
import React, { Component } from 'react'class Index extends Component { state={ count:1 } test1 = () => { // 通过回调函数的形式 this.setState((state,props)=>({ count:state.count+1 })); console.log('test1 setState()之后',this.state.count); } test2 = () => { // 通过对象的方式(注意:此方法多次设置会合并且只调用一次!) this.setState({ count:this.state.count+1 }); console.log('test2 setState()之后',this.state.count); } test3 = () => { // 不能直接修改state的值,此方法强烈不建议!!!因为不会触发重新render this.state.count += 1; } test4 = () => { // 在第二个callback拿到更新后的state this.setState({ count:this.state.count+1 },()=>{// 在状态更新且页面更新(render)后执行 console.log('test4 setState()之后',this.state.count); }); } render() { console.log('render'); return ( <p> <h1>currentState:{this.state.count}</h1> <button onClick={this.test1}>测试1</button> <button onClick={this.test2}>测试2</button> <button onClick={this.test3} style={{color:'red'}}>测试3</button> <button onClick={this.test4}>测试4</button> </p> ) } } export default Index;
2.setState ()更新ステータスが非同期か同期か:
setState が実行される場所を決定する必要がある
同期: コールバック関数によって制御されるby React 媒体: ライフ サイクル フック/反応イベント リスニング コールバック
import React, { Component } from 'react'class Index extends Component { state={ count:1 } /* react事件监听回调中,setState()是异步状态 */ update1 = () => { console.log('update1 setState()之前',this.state.count); this.setState((state,props)=>({ count:state.count+1 })); console.log('update1 setState()之后',this.state.count); } /* react生命周期钩子中,setState()是异步更新状态 */ componentDidMount() { console.log('componentDidMount setState()之前',this.state.count); this.setState((state,props)=>({ count:state.count+1 })); console.log('componentDidMount setState()之后',this.state.count); } render() { console.log('render'); return ( <p> <h1>currentState:{this.state.count}</h1> <button onClick={this.update1}>测试1</button> <button onClick={this.update2}>测试2</button> </p> ) } } export default Index;
非同期: 非反応制御の非同期コールバック関数 媒体: タイマー コールバック/ネイティブ イベントlisten Callback/Promise
import React, { Component } from 'react'class Index extends Component { state={ count:1 } /* 定时器回调 */ update1 = () => { setTimeout(()=>{ console.log('setTimeout setState()之前',this.state.count);//1 this.setState((state,props)=>({ count:state.count+1 })); console.log('setTimeout setState()之后',this.state.count);//2 }); } /* 原生事件回调 */ update2 = () => { const h1 = this.refs.count; h1.onclick = () => { console.log('onClick setState()之前',this.state.count);//1 this.setState((state,props)=>({ count:state.count+1 })); console.log('onClick setState()之后',this.state.count);//2 } } /* Promise回调 */ update3 = () => { Promise.resolve().then(value=>{ console.log('Promise setState()之前',this.state.count);//1 this.setState((state,props)=>({ count:state.count+1 })); console.log('Promise setState()之后',this.state.count);//2 }); } render() { console.log('render'); return ( <p> <h1 ref='count'>currentState:{this.state.count}</h1> <button onClick={this.update1}>测试1</button> <button onClick={this.update2}>测试2</button> <button onClick={this.update3}>测试3</button> </p> ) } } export default Index;
3. setState() への複数の呼び出しに関する問題:
非同期 setState()
(1) 複数の呼び出し、処理メソッド:
setState({}): マージして状態を 1 回更新します。インターフェイスを更新するために render() を 1 回だけ呼び出します。複数の呼び出しwill merge は 1 であり、後続の値は以前の値を上書きします。
setState(fn): 状態を複数回更新します。インターフェイスを更新するには、render() を 1 回だけ呼び出してください。複数回呼び出しても は 1 つにマージされず、後続の値はマージされます。以前の値を上書きします。
import React, { Component } from 'react'class Index extends Component { state={ count:1 } update1 = () => { console.log('update1 setState()之前',this.state.count); this.setState((state,props)=>({ count:state.count+1 })); console.log('update1 setState()之后',this.state.count); console.log('update1 setState()之前2',this.state.count); this.setState((state,props)=>({ count:state.count+1 })); console.log('update1 setState()之后2',this.state.count); } update2 = () => { console.log('update2 setState()之前',this.state.count); this.setState({ count:this.state.count+1 }); console.log('update2 setState()之后',this.state.count); console.log('update2 setState()之前2',this.state.count); this.setState({ count:this.state.count+1 }); console.log('update2 setState()之后2',this.state.count); } update3 = () => { console.log('update3 setState()之前',this.state.count); this.setState({ count:this.state.count+1 }); console.log('update3 setState()之后',this.state.count); console.log('update3 setState()之前2',this.state.count); this.setState((state,props)=>({ count:state.count+1 }));// 这里需要注意setState传参为函数模式时,state会确保拿到的是最新的值 console.log('update3 setState()之后2',this.state.count); } update4 = () => { console.log('update4 setState()之前',this.state.count); this.setState((state,props)=>({ count:state.count+1 })); console.log('update4 setState()之后',this.state.count); console.log('update4 setState()之前2',this.state.count); this.setState({ count:this.state.count+1 });// 这里需要注意的是如果setState传参为对象且在最后,那么会与之前的setState合并 console.log('update4 setState()之后2',this.state.count); } render() { console.log('render'); return ( <p> <h1>currentState:{this.state.count}</h1> <button onClick={this.update1}>测试1</button> <button onClick={this.update2}>测试2</button> <button onClick={this.update3}>测试3</button> <button onClick={this.update4}>测试4</button> </p> ) } } export default Index;
import React, { Component } from 'react'// setState执行顺序class Index extends Component { state={ count:0 } componentDidMount() { this.setState({count:this.state.count+1}); this.setState({count:this.state.count+1}); console.log(this.state.count);// 2 => 0 this.setState(state=>({count:state.count+1})); this.setState(state=>({count:state.count+1})); console.log(this.state.count);// 3 => 0 setTimeout(() => { this.setState({count:this.state.count+1}); console.log('setTimeout',this.state.count);// 10 => 6 this.setState({count:this.state.count+1}); console.log('setTimeout',this.state.count);// 12 => 7 }); Promise.resolve().then(value=>{ this.setState({count:this.state.count+1}); console.log('Promise',this.state.count);// 6 => 4 this.setState({count:this.state.count+1}); console.log('Promise',this.state.count);// 8 => 5 }); } render() { console.log('render',this.state.count);// 1 => 0 // 4 => 3 // 5 => 4 // 7 => 5 // 9 => 6 // 11 => 7 return ( <p> <h1>currentState:{this.state.count}</h1> <button onClick={this.update1}>测试1</button> <button onClick={this.update2}>测试2</button> <button onClick={this.update3}>测试3</button> <button onClick={this.update4}>测试4</button> </p> ) } } export default Index;
要約: React で setState() 更新ステータスを記述する 2 つの方法
1) setState(updater, [callback])updater: stateChange オブジェクトを返す関数: (state, props)=>stateChange、受信したstate と props は保証されます最新の
2) setState(stateChange, [callback])stateChange はオブジェクトであり、callback はオプションのコールバック関数です。ステータスが更新され、インターフェイスが更新されます
の後にのみ実行します。注:
オブジェクトは関数メソッドの短縮形です。
新しい状態が元の状態に依存しない場合、新しい状態が元の状態に依存する場合、オブジェクト メソッドを使用します。 新しい状態が元の状態に依存する場合、関数メソッドを使用します。 setState() の後に最新の状態データを取得する必要がある場合は、コールバック関数の 2 番目の Get でこの記事はjs チュートリアル 列から引用しています。
以上がReact の setState の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。