【发布时间】:2020-10-09 08:48:17
【问题描述】:
我想在 UseEffect 中调用一个 prop 函数。以下代码有效:
useEffect(() => {
props.handleClick(id);
}, [id]);
但 lint 抱怨 props 不是依赖项。
如果我这样做,那么代码将不再有效,并且我有最大的重新渲染错误:
useEffect(() => {
props.handleClick(id);
}, [id, props]);
如何解决 lint 问题?
示例代码:
父组件
const ParentGrid = ({rows, columns}) => {
const [selection, setSelection] = useState(null);
const handleClick = selectedRows => {
setSelection(selectedRows.map(i => rows[i]));
};
return (
<ChildGrid
columns={columns}
data={data}
handleClick={handleClick}
/>
子组件
const ChildGrid = props => {
const {data, handleClick, ...rest} = props;
useEffect(() => {
handleClick(selectedRows);
}, [selectedRows]);
【问题讨论】:
-
见这里:github.com/facebook/create-react-app/issues/6880。我用这条线
// eslint-disable-next-line react-hooks/exhaustive-deps -
你不需要把不重要的地方改成useEffect依赖列表。
-
是什么触发了
id在您的组件中发生更改?您可能不必使用useEffect来实现您的目标。 -
@Hangindev 感谢您的提示,我对其进行了重构以避免
useEffect -
@SAKURA 不客气。只是让您知道最大重新渲染错误的原因是因为
handleClick触发了ParentGrid的状态更改,这导致重新渲染并创建了一个新的handleClick函数并导致重新运行useEffect在ChildGridarrow 中的回调...♻ 为了避免这种情况,重构是一种解决方案,或者您可以使用useCallback创建一个记忆化的handleClick函数,如@iamaatoh 建议的那样。 useCallback docs
标签: javascript reactjs frontend lint