【发布时间】:2022-01-07 20:09:03
【问题描述】:
我的useEffect 挂钩中使用了一个函数,我必须添加dependency array。我还有一些其他依赖项作为来自外部组件的道具传递。由于该依赖函数,我不得不将我的函数包装在 useCallback 中,以避免在每次渲染时都发生更改。但我很困惑为什么错误仍然弹出?还有我应该怎么过呢?
import _ from "lodash";
import React, { useCallback, useEffect, useState } from "react";
function App({uniqueCol,data,handleSelect, unselectAll = false}) {
const [selected, setSelected] = useState(new Set(""));
const [currentRows, setCurrentRows] = useState(data);
//here it is fine when I add currentRows and uniqueCol as dependencies
const changeSelect = useCallback(
(id: string, status: boolean) => {
const cr = currentRows.map((row) => {
if (uniqueCol) {
// @ts-ignore
if (row[uniqueCol] == id) row.selected = status;
}
return row;
});
setCurrentRows(cr);
},
[currentRows, uniqueCol]
);
useEffect(() => {
selected.forEach((sel) => changeSelect(sel, true));
setCurrentRows(data);
}, [changeSelect, data, selected]);
/*here it causes errors when I add changeSelect, currentRows,
handleSelect as dependencies but works fine when I remove them*/
const unSelectAll = useCallback(() => {
setSelected(new Set(""));
_.map(currentRows, "id").forEach((val) => {
changeSelect(val, false);
});
if (handleSelect) handleSelect([]);
}, [changeSelect, currentRows, handleSelect]);
//another useEffect that is using the function unSelectAll as a dependency
useEffect(() => {
unSelectAll();
}, [unSelectAll, unselectAll]);
return <h1>Anything here</h1>;
}
我得到的错误是:
react-dom.development.js:67 警告:超过最大更新深度。当组件在 useEffect 中调用 setState 时,可能会发生这种情况,但 useEffect 要么没有依赖数组,要么每次渲染时其中一个依赖项都发生了变化。
【问题讨论】:
-
能贴一下useEffect代码吗?
-
handleSelect 来自组件的外部。它不能确定它是否正在改变。也许记忆可以帮助
const memorizedHandler = React.useMemo(()=>handleSelect, [handleSelect]);,然后使用memorizedHandler。如果它不起作用,请使用 useRef。 -
我用了这个然后这段代码也造成了无限渲染:
useEffect(() => { selected.forEach((sel) => changeSelect(sel, true)); setCurrentRows(data); }, [changeSelect, data, selected]);
标签: javascript reactjs frontend