最近正在看React
有看到兩個例子,想請教一下
function ExampleA() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
function ExampleB() {
const [obj, setObject] = useState({
count: 0,
name: "ml"
});
return (
<div>
Count: {obj.count}
<button onClick={() => setObject({ ...obj, count: obj.count + 1 })}>+</button>
</div>
);
}
1.為什麼ExampleB的Hook要這樣寫?還有他的setObject也為什麼要這樣寫?
我看這兩個執行結果都差不多,不太清楚他們的差異
2.Example的setCount裡他是這樣寫
<button onClick={() => setCount(count + 1)}>
但我看到有網站說這樣比較安全
<button onClick={() => setCount(prevCount => prevCount + 1)}>
真的是如他所說的嗎?我看滿多範例都還是單純的(count+1)
這些我暫時還不太懂,所以想請問一下
你貼的那個網站有說了
因為 useState 是非同步的 所以那樣寫可能會導致在某些情況下變數沒有更新
官方給的範例其實也是使用這種方式
下面也解釋了兩種使用上的差異
<button onClick={() => setCount(prevCount => prevCount + 1)}>
ExampleB的setState的写法是这样:
setObject({ ...obj, count: obj.count + 1 })}
这是因为ExampleB组件的state: obj是引用类型。每次setObject的时候,傳給它的參數要是一個全新的引用。所以setObject的入參是一個全新對象。對象采用這種寫法:
{ ...obj, count: object.count + 1 }
這是一種簡易寫法,先展開obj,再用新的字段覆蓋原有obj的值。當然你也可以這樣寫:
setObject({ name: "ml", count: object.count + 1 })
效果是一樣的。只要保證只改動需要變化的字段,其餘的字段保持不變即可