如果我有两个选择控件,一个依赖于另一个,所以如果我改变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
,还是只更改selectA
onChange
方法上的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
的值可以是任何类型,但我认为它是一个对象。
2条答案
按热度按时间rbpvctlc1#
是的,
useEffect
可能会慢一些,但我不认为性能是这里的主要问题。一般来说,官方的建议是不要过度使用
useEffect
。如果你能做一些没有它,它可能是更好地做它没有它。关于docs:
效果是React范式的一个逃生口。它们允许你“走出”React,并将你的组件与一些外部系统同步,比如非React小部件、网络或浏览器DOM。如果没有涉及外部系统(例如,如果您希望在某些属性或状态发生更改时更新组件的状态),则不需要Effect。删除不必要的效果将使您的代码更易于理解、运行速度更快、更不易出错。
ps.上面引用的“效果”是指React的具体定义。而不是“副作用”这个更广泛的编程概念。
q8l4jmvw2#
关于性能,直接在
onChange
中设置值更好。对于useEffect
,您需要进行两次重新渲染,因为第二次更新将在第一次重新渲染之后进行。但在大多数情况下,这并不重要如果您的
selectA
从多个位置更新,则useEffect
很好。例如,如果您对selectB
进行CRUD操作,则selectB
的更新逻辑将位于1个位置,而不是每个操作。在某些情况下,如果您希望UI使用两个新值而不是1乘1重新呈现,您将被迫更新
onChange
中的第二个状态