【发布时间】:2020-10-29 15:12:16
【问题描述】:
我想使用useEffect() 来检测状态值的变化,并使用作为道具接收的回调函数将该值传递给父组件。如果不禁用 eslint 缺少依赖项警告,我想不出办法做到这一点。我在子组件和那个孩子的孩子上都有这个问题。
这里是父实现:
const updateValues = (newValues) => {
setValues({ ...values, ...newValues });
};
<GeneralUpdates onUpdate={updateValues} />
这是第一个孩子(GeneralUpdates):
const [values, setValues] = useState({
name: '',
description: '',
});
// This handles form input changes
const handleChange = (prop) => (event) => {
setValues({ ...values, [prop]: event.target.value });
};
useEffect(() => {
onUpdate(values);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [values]);
<FilesUpload handleChange={onUpdate}/>
这是孩子的孩子(FilesUpload):
const [featuredPhotos, setFeaturedPhotos] = useState([]);
useEffect(() => {
handleChange({ featuredPhotos });
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [featuredPhotos]);
将handleChange 添加为依赖项会导致无限的重新渲染循环。我已经尝试了所有我能找到的解决方案,但这里肯定遗漏了一些东西。
【问题讨论】:
-
您可以禁用,否则您将不得不记住
handleChange,因为该函数值可能会在每次重新渲染时不断变化,从而再次触发useEffect。 -
第一个孩子中的
setValues来自哪里?如果您可以在代码沙箱或代码笔上添加一个小示例,这将对其他人有很大帮助 -
我已经添加了它@RaheelRiaz,还添加了对我有用的解决方案作为答案,但绝对有兴趣获得更多洞察力。
标签: reactjs react-hooks create-react-app eslint