Myk*_*ybo 12 javascript reactjs react-hooks
是吗,为什么从 React 的新 useState 钩子改变状态是个坏主意?我没有找到有关该主题的信息。
考虑以下代码:
const [values, setValues] = useState({})
// doSomething can be called once, or multiple times per render
const doSomething = (name, value) => {
values[name] = value
setValues({ ...values })
}
Run Code Online (Sandbox Code Playgroud)
注意值的变化。由于每次渲染可以多次调用 doSomething,由于 setState 的异步属性,这样做将不起作用:
const doSomething = (name, value) => {
setValues({ ...values, [name]: value })
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,直接改变值的方法是否正确?
Tho*_*lle 15
您永远不应该直接改变状态,因为如果您使用相同的对象引用更新状态,它甚至可能不会导致重新渲染。
const { useState } = React;
function App() {
const [values, setValues] = useState({});
const doSomething = (name, value) => {
values[name] = value;
setValues(values);
};
return (
<div onClick={() => doSomething(Math.random(), Math.random())}>
{JSON.stringify(values)}
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>Run Code Online (Sandbox Code Playgroud)
您可以setValues像在类组件中一样将函数作为第一个参数setState,然后该函数将获得正确的状态作为参数,返回的将是新状态。
const doSomething = (name, value) => {
setValues(values => ({ ...values, [name]: value }))
}
Run Code Online (Sandbox Code Playgroud)
const doSomething = (name, value) => {
setValues(values => ({ ...values, [name]: value }))
}
Run Code Online (Sandbox Code Playgroud)
const { useState } = React;
function App() {
const [values, setValues] = useState({});
const doSomething = (name, value) => {
setValues(values => ({ ...values, [name]: value }));
};
return (
<div onClick={() => doSomething(Math.random(), Math.random())}>
{JSON.stringify(values)}
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6102 次 |
| 最近记录: |