在 React 裡,你常常聽到「不要直接修改 state」。
但為什麼呢?這跟 JavaScript 的物件是 call by reference 有關。
在 JavaScript 中,物件和陣列都是 以 reference(參考位址)傳遞 的。
const a = { x: 1 };
const b = a;
b.x = 2;
console.log(a.x); // 2
a
和 b
指向同一個物件,改了 b
,a
也會跟著變。
React 判斷 state 是否改變,也是靠 reference:
這就是為什麼我們要使用 不可變語法 (immutable syntax)。
const [user, setUser] = useState({ name: "Andy", age: 25 });
function updateAge() {
user.age = 26; // 改同一個 reference
setUser(user); // React 以為沒變
}
function updateAge() {
setUser({ ...user, age: 26 }); // 新物件,新 reference
}
setTodos([...todos, newTodo])
setUser({ ...user, age: 26 })
判斷以下哪個正確:
const [list, setList] = useState(["a", "b"]);
// A
list.push("c");
setList(list);
// B
setList([...list, "c"]);
👉 答案:A 錯、B 對。
在 React 裡,物件是 call by reference。React 判斷 state 是否改變是比對 reference。
如果直接改舊 state,reference 不變,React 可能跳過更新。
所以要用不可變寫法,例如展開運算子,建立新物件或新陣列。
英文
In React, objects are call by reference. React checks state by reference.
If you mutate the old state, the reference doesn’t change, so React may skip re-rendering.
Always use immutable updates like spread to create a new object or array.