【发布时间】:2020-06-30 02:52:36
【问题描述】:
目前我设置了两个组件,其中父级呈现一些数据并处理检索,而子级是一个过滤器。此过滤器允许用户按状态或关键字进行过滤。没什么特别的。
现在这是一个分页系统。在父母对数据进行初始请求后,如果他们想要更多,他们会获得下一页 ID 来请求。但是如果过滤器更新了,这个下一页 ID 需要被清除,因为它不好。
所以我所做的就是将一个名为updateFilter() 的函数从父级传递给子级。如果过滤器组件的状态有更新,它会调用父组件并运行updateFilter()。更新的值之一包含在 useEffect() 依赖数组中,因此父级然后使用新过滤器请求新数据。很简单。
问题在于设置孩子的useEffect()。 Eslint 告诉我需要将props.updateFilter 添加到依赖数组中,虽然我可以忽略这一点,但我觉得这样做是错误的。但是父级有相当多的状态会更新,当它更新时,它会将updateFilter() 的新副本向下传递给子级,这会导致它错误地触发。
我该如何解决这个问题?我可以告诉孩子只使用这个函数的静态版本吗?还是我只是从依赖数组中排除props.updateFilter?下面是我的组件的粗略伪代码。
Parent {
const [stateVal, setStateVal] = useState(...);
function updateFilter(filterStatus) {
...
setStateVal(filterStatus);
}
useEffect(() => ..., [stateVal]);
return <Child updateFilter={updateFilter} />
}
Child {
const [filterStatus, setStatus] = useState(...);
useEffect(() => {
props.updateFilter(filterStatus);
}, [filterStatus] // Adding `props` here is what I think I should do, but that causes the issue. Apparently the `props` val changes every time Parent's state changes
return ( ... );
}
【问题讨论】:
-
"Eslint 告诉我需要将
props.updateFilter添加到依赖数组中,虽然我可以忽略这一点,但我觉得这是错误的。"为什么你觉得这是不对的?它是一个传递的道具,消费组件可以对其参考稳定性做出零断言。正如 Diesel 正确指出的那样,您可以记住父级传递给子级的回调。 -
因为我读过的所有内容都表明这不是一个有效的实例,我应该从依赖数组中排除值。
-
啊,我在您质疑 linter 时解释了您的评论,并认为 it 是错误的。我明白了。
-
明白了!不,我的意思是忽略 linter 的行为是错误的。是的,这还不清楚。我的错。
标签: reactjs react-hooks