React:useStateの非同期アップデート
1276 ワード
導入する直感的に騙されました.私たちはバートンをクリックして、2回のsetNを実行するはずです.nは2になります. 実際:nは1 になります.
なぜnは1で、2ではないですか?
まず、useStateの原理を明らかにします.私のブログを参考にして、useStateの簡易実現を説明しました.https://segmentfault.com/a/11....知っています. useStateは実行するたびに新しいstate(単純なタイプの等価コピー) を返します. set Stateは、UI更新をトリガする . UI更新は非同期タスクであるため、set Stateも非同期プロセス である.
は、まずそれぞれ2つの新しいnを生成し、値はn+1(すなわち1)に等しいが、互いに無関係である. はそれぞれレンデを行いましたが、最新のレンデだけが有効です.今回レンデは最後のsetN関数で生成されたnを引用しました. 解決方法によって受信された関数 を表している.は、関数コードを使用して を行うことを推奨する.
function App() {
const [n, setN] = useState(0)
const onClick = ()=>{
setN(n+1)
setN(n+1) // ,n +1, +2
// setN(i=>i+1)
// setN(i=>i+1)
}
return (
n: {n}
);
}
ReactDOM.render(, document.getElementById("root"));
reactコードは上の図のようです.なぜnは1で、2ではないですか?
まず、useStateの原理を明らかにします.私のブログを参考にして、useStateの簡易実現を説明しました.https://segmentfault.com/a/11....
setN(n+1)
を2回行ったとき、実際には2つのクローズドが形成され、このときのnの状態(n=0)への参照が保存されています.setNの後:// , ,
setState( x => x+1 )
x=>x+1
は、nへの参照を保持しない代わりに、1つのアクションを追加するsetState