[英]React, component not re-rendering after change in an object state
還有其他 Stack Overflow 線程與這個問題有點相關,但回答得非常簡短。 我想創建一個更明確地處理更改state
時發生的問題object
。
在下面的代碼中,我正在更新單擊user
對象的firstName
屬性,這是一個state
,但沒有發生任何事情。 這是為什么?
export default function App() {
const [user, setUser] = useState({
firstName: "Jhon",
lastName: "Doe",
});
const changeFirstAndLastName = () => {
const newUser = user;
newUser.firstName = "David";
setUser(newUser);
};
return (
<div>
<div>
<p>First Name: {user.firstName}</p>
<p>Last Name: {user.lastName}</p>
</div>
<button onClick={changeFirstAndLastName}>Change First Name</button>
</div>
);
}
React 不會重新渲染,因為它就像什么都沒有改變,即每次你將相同的state
賦予setState
時。 對於像Number
、 String
和Boolean
這樣的原始值,很明顯知道我們是否給出了不同的值。
另一方面,對於像Object
和Array
這樣的引用值,更改它們的content
不會將它們標記為不同。 它應該是不同的內存reference
。 查看您的注釋代碼以了解您做錯了什么:
const newUser = user; // does a reference copy => newUser == user
newUser.firstName = "David"; // changes its content => newUser == user
setUser(newUser); // at this point it's like nothing has changed
解決方案可能是擴展運算符,將創建現有對象的副本,但在新的內存reference
上,然后覆蓋要更改的屬性:
const newUser = {...user}; // creates a copy of user on a new reference
newUser.firstName = "David"; // updates firstName field of it
setUser(newUser); // new reference is given to setUser
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.