reactjs - 仅当两个依赖项都更改时才运行效果挂钩
问题描述
useEffect
我有一个使用钩子获取数据的 React 组件,如下所示:
const cache = {key: "data-fetched-using-key"}
function Config({key, options}) {
const [data, setData] = useState();
useEffect(() => {
const fetchedData; // fetch data using key and options
setData(fetchedData);
cache[key] = fetchedData;
}, [key, options])
return <p>{data}</p>;
}
每次key
或options
更改时都会运行钩子。但是,我也在本地缓存数据,并且只希望在两者都更改时运行效果key
(options
因为对于每个键/选项组合,数据将始终相同)。
有没有一种干净的方法来依赖key
AND的组合options
而不是使用 React Hooks的key
OR ?options
解决方案
您可以使用useRef()
. 考虑以下示例和沙箱:https ://codesandbox.io/s/react-hooks-useeffect-with-multiple-reqs-6ece5
const App = () => {
const [name, setName] = useState();
const [age, setAge] = useState();
const previousValues = useRef({ name, age });
useEffect(() => {
if (
previousValues.current.name !== name &&
previousValues.current.age !== age
) {
//your logic here
console.log(name + " " + age);
console.log(previousValues.current);
//then update the previousValues to be the current values
previousValues.current = { name, age };
}
});
return (
<div>
<input
placeholder="name"
value={name}
onChange={e => setName(e.target.value)}
/>
<input
placeholder="age"
value={age}
onChange={e => setAge(e.target.value)}
/>
</div>
);
};
工作流程:
ref
我们为要跟踪的两个值创建一个对象,在本例中为 aname
和age
。ref 对象是previousValues
.useEffect
已定义,但我们不提供任何依赖项。name
相反,只要or的状态发生变化,我们就让它执行age
。- 现在在里面
useEffect
我们有条件逻辑来检查两者的先前/初始值是否与name
它们age
对应的状态值不同。如果它们很好,我们将执行我们的逻辑(console.log)
。 - 最后在执行逻辑之后,将 ref 对象更新
(previousValues)
为当前值(state)
。
推荐阅读
- java - 每当我尝试读取文件时,我都会收到错误消息,我尝试拖动 txt 文件,但仍然出现错误。我想知道是不是有什么问题?
- python - Asyncio 递归限制和最大线程处理
- node.js - Gmail NodeJs客户端中的Gmail API userId用例?
- c# - SDK风格项目文件如何优化自动生成版本号
- c++ - 在 DLL 注入中访问内存会导致内存访问冲突
- mariadb - mariadb char(250)*20 与 text(5000) 的性能对比
- django - Django 应用的 request.user.is_authenticated 的哪一部分是真实的?
- r - 在 for 循环中评估解析表达式的问题:将返回值分配给全局环境中的向量
- mysql - Maria DB 中的触发错误中的 mySQL IF 语句
- slack - 如何让我的 Slack 应用程序忽略群组频道中的消息?