从 React 的 useState 钩子改变状态

IT技术 javascript reactjs react-hooks
2021-05-13 09:25:57

是吗,为什么从 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 })
}

注意值的变化。由于每次渲染可以多次调用 doSomething,由于 setState 的异步属性,这样做将不起作用:

const doSomething = (name, value) => {
  setValues({ ...values, [name]: value })
}

在这种情况下,直接改变值的方法是否正确?

2个回答

您永远不应该直接改变状态,因为如果您使用相同的对象引用更新状态,它甚至可能不会导致重新渲染。

您可以将函数作为第一个参数,setValues就像您在类组件中习惯的那样setState,然后该函数将获得正确的状态作为参数,返回的将是新状态。

const doSomething = (name, value) => {
  setValues(values => ({ ...values, [name]: value }))
}

基本上我会避免以这种方式改变状态,只是为了纯度。

但是,我认为在这种情况下它完全没问题。当你在 state 的内部级别改变一个值时,它不会被 React 注意到。只有在使用新的引用调用 setValues() 时,React 才会注意到新的渲染正在挂起。

(如果有人可以提供一个反例,我很乐意看到它)。