在我的功能组件中,我有状态,每当状态更改时,我都想做些事情。所以我用过useEffect,但它给出了“缺少依赖项”错误。在我把所有依赖项显示在错误中后,我得到了无限循环。这是代码:
const [keywords, setKeywords] = useState<Keyword[]>();
const [currentPage, pagingConfig, setPagingConfig] = usePaging();
useEffect(() => {
const loadKeywords = async () => {
const { current, pageSize } = pagingConfig;
const keywords = await getKeywords(current as number, pageSize as number);
setKeywords(keywords.data.data);
setPagingConfig({
...pagingConfig,
total: keywords.data.total,
});
};
loadKeywords();
}, [currentPage]); // Requires to add pagingConfig and setPagingConfig
如果添加了必需的依赖项,则会出现无限循环。
如何避免此错误?
答案 0 :(得分:0)
这就是我的看法。
首先,我在我的react编码中也看到了'dependency missing'句子。如果我没看错,那是警告。也许您可以澄清。以我的经验,只要不影响最终输出,就可以忽略它。您必须记住,内置工具遵循规则和语义,但是您需要确定何时可以忽略警告。
第二,一旦添加了缺少的依赖关系(以摆脱警告),您实际上就是在useEffect内进行状态更改。通过重新定义,视图将再次呈现,并且您又回到了useEffect内部。因此,这就是为什么您遇到无限循环的原因。
解决方法是
答案 1 :(得分:0)
发生无限循环是因为
setPagingConfig
更新useEffect
useEffect
之所以重新运行,是因为pagingConfig
发生了更改,因此在更新依赖项时发生了重新呈现的情况。
setPagingConfig
更新useEffect
你去了,你有一个无限循环
只有在pagingConfig
实际上具有不同的keywords.data.total
答案 2 :(得分:0)
在这种情况下,方法是只更改状态(如果值已更改):
const [keywords, setKeywords] = useState<Keyword[]>();
const [currentPage, pagingConfig, setPagingConfig] = usePaging();
useEffect(() => {
const loadKeywords = async () => {
const { current, pageSize } = pagingConfig;
const newKeywords = await getKeywords(current as number, pageSize as number);
if (newKeywords.data.data !== keywords) {
setKeywords(newKeywords.data.data);
setPagingConfig({
...pagingConfig,
total: keywords.data.total,
});
}
};
loadKeywords();
}, [currentPage, pagingConfig, setPagingConfig]);
由于关键字未更改,因此在第二个迭代状态下不再更新。