reactjs React -使用useEffect或直接在onChange方法中更改值对性能最好吗?

avwztpqn  于 2023-05-22  发布在  React
关注(0)|答案(2)|浏览(140)

如果我有两个选择控件,一个依赖于另一个,所以如果我改变selectA值,selectB值将根据它被选择:

...
const [values, setValues] = useState({ selectA: undefined, selectB: undefined });
const setSelectValue = (field, value) => {
  setValues((current) => {...current, [field]: value});
}

return (
  <>
    <Select
      name="selectA"
      value={values.selectA}
      onChange={(val) => setSelectValue('selectA', val)}
      ...
    />
    <Select
      name="selectB"
      value={values.selectB}
      onChange={(val) => setSelectValue('selectB', val)}
      ...
    />
  </>
);

在性能方面,最好使用useEffect,还是只更改selectAonChange方法上的selectB值?

// Is it best to use useEffect
useEffect(() => {
  setSelectValue('selectB', values.selectA.potato);
}, [values.selectA]);

// ... or is it best to change it directly on onChange method?
<Select
  name="selectA"
  value={values.selectA}
  onChange={(val) => {
    setSelectValue('selectA', val);
    setSelectValue('selectB', val.potato);
  }}
  ...
/>

”””这一切都重要吗?两者在性能上有什么区别吗?**
我知道useEffect可以方便地处理依赖于可以随时更新的数据的副作用,但是在这种情况下,当我在selectA上选择它时,我知道数据是正确的,并且不能以任何其他方式更改,所以我想知道是否有必要制作一个useEffect来观察该值,而不是直接获取它并设置它。
请记住,selectA.potato的值可以是任何类型,但我认为它是一个对象。

rbpvctlc

rbpvctlc1#

是的,useEffect可能会慢一些,但我不认为性能是这里的主要问题。
一般来说,官方的建议是不要过度使用useEffect。如果你能做一些没有它,它可能是更好地做它没有它。
关于docs
效果是React范式的一个逃生口。它们允许你“走出”React,并将你的组件与一些外部系统同步,比如非React小部件、网络或浏览器DOM。如果没有涉及外部系统(例如,如果您希望在某些属性或状态发生更改时更新组件的状态),则不需要Effect。删除不必要的效果将使您的代码更易于理解、运行速度更快、更不易出错。
ps.上面引用的“效果”是指React的具体定义。而不是“副作用”这个更广泛的编程概念。

q8l4jmvw

q8l4jmvw2#

关于性能,直接在onChange中设置值更好。对于useEffect,您需要进行两次重新渲染,因为第二次更新将在第一次重新渲染之后进行。但在大多数情况下,这并不重要
如果您的selectA从多个位置更新,则useEffect很好。例如,如果您对selectB进行CRUD操作,则selectB的更新逻辑将位于1个位置,而不是每个操作。
在某些情况下,如果您希望UI使用两个新值而不是1乘1重新呈现,您将被迫更新onChange中的第二个状态

相关问题