reactjs - 在 useEffect 钩子中,如何找出是什么事件触发了状态变化?
问题描述
我useEffect
在更新状态后使用钩子来执行一些副作用。这工作得很好,每当子组件调用时setOptions
,useEffect
也会触发。
我试图弄清楚是否有一种方法可以区分谁更新了选项并在此基础上执行附加工作?更准确地说,我想useEffect
仅当依赖项由特定组件更新时才调用另一个函数。这是我正在尝试做的一个愚蠢的例子:
function App() {
const [value, setValue] = useState({});
const [options, setOptions] = useState([]);
useEffect(() => {
const newValues = await getNewValues();
setValue(newValues);
// If options have been changed from ChildComponentA
// Then doSomething() else nothing
}, [options]);
function doSomething() {}
return(
<>
<ChildComponentA handleChange={setOptions} />
<ChildComponentB handleChange={setOptions} />
</>
)
}
这个例子可能很奇怪,这只是我遇到的问题的一个例子。主要问题是状态可以被多个事件改变,我不知道是哪个事件触发了状态改变。
解决方案
也许您可以尝试向您的options
变量添加一个附加参数,该参数会告诉您从何处触发更改,即options.child = 'A'
,会告诉您它来自 A 并且您可以在 useEffect 中使用条件 as 进行检查,if (options.child == 'A')
这当然需要options
是一个对象而不是一个数组,并且在handleChange
回调中你可以做类似的事情。
<ChildComponentA handleChange={(value) => {value.child ='A'; setOptions(value);}} />
更深入地说,作为个人建议,您的应用程序不应该旨在在同一状态下工作,如果它被一个地方或另一个地方改变,因为状态的主要目的之一是成为您组件中的通用真理来源并且每个使用它的子组件都这样对待它。
推荐阅读
- python - 如何将结果保存到文件中?
- r - 如果元素不在向量中,则将元素添加到向量中,然后再次搜索向量
- javascript - 用实习生框架理解 BDD
- .net - 与 .NET Web 应用程序和 .NET 移动应用程序共享数据库
- python - 什么可能导致 ColumnTransformer 出现这种奇怪的行为?[Python/sklearn]
- amazon-web-services - 监控 NVMe 卷的磁盘利用率 - CloudWatch
- c++ - C++ 入门 5 版:计数引用和底层指针
- javascript - 我在 localhost 上的 cURL 脚本中有问题 网站页面不完整 看看 capturev
- sql-server - SQL Server 作业中的大型机作业依赖性
- xml - 在 Oracle 中查找重复的子节点