gpt4 book ai didi

javascript - 使用嵌套字段/对象时,使用 React setState 钩子(Hook)更新后状态消失

转载 作者:行者123 更新时间:2023-11-28 17:16:06 25 4
gpt4 key购买 nike

在下面的示例中,当我更新某个字段时,状态对象中的另一个字段消失/取消设置,并且我收到有关输入变得不受控制的警告。下面的例子:

const {useState} = React;

const App = () => {
const [user, setUser] = useState({
firstName: 'Mary',
lastName: 'Poppins',
});

return (
<div>
First Name: <input value={user.firstName} onChange={e => {
setUser({firstName: e.target.value});
}} />
<br />
Last Name: <input value={user.lastName} onChange={e => {
setUser({lastName: e.target.value});
}} />
<br />
{JSON.stringify(user, null, 2)}
</div>
);
};

ReactDOM.render(<App />, document.querySelector('#app'));
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>

最佳答案

正如 React 文档所述:

However, unlike this.setState in a class, updating a state variable always replaces it instead of merging it.

因此,使用setUser不会对对象进行浅层合并,而是用整个对象替换状态,这会导致另一个字段消失。在执行 setUser 时,您可以使用 Object.assign 或 spread (...) 运算符将对象合并在一起。

const {useState} = React;

const App = () => {
const [user, setUser] = useState({
firstName: 'Mary',
lastName: 'Poppins',
});

return (
<div>
First Name: <input value={user.firstName} onChange={e => {
setUser(Object.assign({}, user, {firstName: e.target.value}));
}} />
<br />
Last Name: <input value={user.lastName} onChange={e => {
setUser(Object.assign({}, user, {lastName: e.target.value}));
}} />
<br />
{JSON.stringify(user, null, 2)}
</div>
);
};

ReactDOM.render(<App />, document.querySelector('#app'));
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>

或者,创建一个名为 useMergeState 的自定义 Hook 帮助您像通常的 setState 一样自动合并。

关于javascript - 使用嵌套字段/对象时,使用 React setState 钩子(Hook)更新后状态消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53471860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com