我最终从各种答案中汲取了一点点来制作自己的钩子。我希望能够直接删除一些东西useEffect
来快速调试正在触发的依赖项useEffect
。
const usePrevious = (value, initialValue) => {
const ref = useRef(initialValue);
useEffect(() => {
ref.current = value;
});
return ref.current;
};
const useEffectDebugger = (effectHook, dependencies, dependencyNames = []) => {
const previousDeps = usePrevious(dependencies, []);
const changedDeps = dependencies.reduce((accum, dependency, index) => {
if (dependency !== previousDeps[index]) {
const keyName = dependencyNames[index] || index;
return {
...accum,
[keyName]: {
before: previousDeps[index],
after: dependency
}
};
}
return accum;
}, {});
if (Object.keys(changedDeps).length) {
console.log('[use-effect-debugger] ', changedDeps);
}
useEffect(effectHook, dependencies);
};
下面是两个例子。对于每个示例,我假设dep2
从“foo”更改为“bar”。示例 1 显示了未通过的输出dependencyNames
,示例 2 显示了带有 dependencyNames
.
示例 1
前:
useEffect(() => {
// useEffect code here...
}, [dep1, dep2])
后:
useEffectDebugger(() => {
// useEffect code here...
}, [dep1, dep2])
控制台输出:
{
1: {
before: 'foo',
after: 'bar'
}
}
对象键“1”表示更改的依赖项的索引。在这里,已dep1
更改并且是依赖项中的第二项,或索引 1
示例 2
前:
useEffect(() => {
// useEffect code here...
}, [dep1, dep2])
后:
useEffectDebugger(() => {
// useEffect code here...
}, [dep1, dep2], ['dep1', 'dep2'])
控制台输出:
{
dep2: {
before: 'foo',
after: 'bar'
}
}