gpt4 book ai didi

reactjs - 当所有依赖项都改变时使用效果?

转载 作者:行者123 更新时间:2023-12-04 11:07:40 24 4
gpt4 key购买 nike

当前 useEffect当只有一个依赖项发生变化时会触发。
当两个(或所有)依赖项都发生变化时,我如何更新它/使用它来回火?

最佳答案

当所有依赖项都发生变化时,您需要添加一些逻辑来调用您的效果。这是useEffectAllDepsChange这应该可以实现您想要的行为。
这里的策略是将之前的 deps 与当前的 deps 进行比较。如果它们不完全不同,我们将之前的 deps 保留在 ref 中,并且在它们不同之前不要更新它。这允许您在调用效果之前多次更改 deps。

import React, { useEffect, useState, useRef } from "react";

// taken from https://usehooks.com/usePrevious/
function usePrevious(value) {
const ref = useRef();

useEffect(() => {
ref.current = value;
}, [value]);

return ref.current;
}

function useEffectAllDepsChange(fn, deps) {
const prevDeps = usePrevious(deps);
const changeTarget = useRef();

useEffect(() => {
// nothing to compare to yet
if (changeTarget.current === undefined) {
changeTarget.current = prevDeps;
}

// we're mounting, so call the callback
if (changeTarget.current === undefined) {
return fn();
}

// make sure every dependency has changed
if (changeTarget.current.every((dep, i) => dep !== deps[i])) {
changeTarget.current = deps;

return fn();
}
}, [fn, prevDeps, deps]);
}

export default function App() {
const [a, setA] = useState(0);
const [b, setB] = useState(0);

useEffectAllDepsChange(() => {
console.log("running effect", [a, b]);
}, [a, b]);

return (
<div>
<button onClick={() => setA((prev) => prev + 1)}>A: {a}</button>
<button onClick={() => setB((prev) => prev + 1)}>B: {b}</button>
</div>
);
}
Edit vibrant-sky-q9hju
由 Richard 启发的另一种方法更简洁,但缺点是在更新中渲染更多。
function useEffectAllDepsChange(fn, deps) {
const [changeTarget, setChangeTarget] = useState(deps);

useEffect(() => {
setChangeTarget(prev => {
if (prev.every((dep, i) => dep !== deps[i])) {
return deps;
}

return prev;
});
}, [deps]);

useEffect(fn, changeTarget);
}

关于reactjs - 当所有依赖项都改变时使用效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62974717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com