【发布时间】:2021-08-25 10:20:58
【问题描述】:
堆栈溢出,
我有一个关于React Hooks 的问题,尤其是useEffect 钩子。我知道useEffect 钩子的一个用例是捕获某些状态变量的变化。
假设我们有以下代码:
const MyComponent = () => {
const [sv, setSv] = useState([
{
a: 1,
b: { c: 'val11', d: 'val12', e: 'val13' }
},
{
a: 8,
b: { c: 'val21', d: 'val22', e: 'val23' }
},
{
a: 19,
b: { c: 'val31', d: 'val32', e: 'val33' }
}
]);
const someCallback = useCallback(() => {
console.log('change triggered!')
});
useEffect(someCallback, [sv]);
}
我们还假设sv 是一个对象数组,每个对象都有相同的一组键,但与这些键关联的值不同。
如果我想对sv 所做的任何 更改(包括嵌套在数组sv 包含的每个对象中的对象)执行someCallback,它就可以正常工作。
现在让我们假设只有当数组sv 中每个对象的某些属性发生变化时才需要执行someCallback。例如,我只想监控对b.c 和b.d 的更改。我认为可行的方式是:
useEffect(someCallback, [sv.map(item => item.b.c), sv.map(item => item.b.d)]);
但是,它根本没有触发。这可能是因为Array.mapcreates a new array with no reference to the previous one,但是,我想不出任何其他方法来映射必要的值。
非常感谢任何帮助。
谢谢!
【问题讨论】:
-
如果您传播应该实际工作的映射数组。
useEffect(someCallback, [...sv.map(item => item.b.c), ...sv.map(item => item.b.d)]); -
也许你可以保持以前的状态,检查你想改变的对象的部分是否在新的状态下改变了。在 useEffect 中执行此操作(比较新状态和先前状态)。这是一个混乱的方式,但它应该工作。
标签: reactjs react-hooks use-effect