开发者问题收集

React - 出现“渲染的钩子比上次渲染时多”错误

2020-03-29
8751

我有以下组件:

const [eventCounter, setEventCounter] = useState(0)

let subsectionRefs = data ? Object.values(data).reduce((acc, event) => {
    acc[event.id] = useRef();
    return acc;
}, {}) : {};

    const setRankChangeFocus = eventID => {
    setEventCounter(eventCounter + 1);
    window.scrollTo(0, subsectionRefs[eventID].current.offsetTop);
};

return (
                    <Comp
                        key={event.id}
                        onRankChange={(value) => {
                            setRankChangeFocus(value);
                        }}
                    />

)

本质上,我希望 subsectionRefs 每次从子组件 Comp 调用 setRankChangeFocus(value) 时重新初始化自身。

但是,当我加载页面时,我收到“渲染的钩子比上次渲染时多”错误 - 为什么?我做错了什么?

2个回答

您正在从 setRankChangeFocus 中调用 setEventCounter 函数,它既不是自定义钩子也不是适当的 React 函数组件。请参阅 钩子规则

Sean H
2021-07-23

您不能 在条件中使用钩子 ,就像使用 useRef 一样。

Only call Hooks at the top level. Don’t call Hooks inside loops, conditions, or nested functions.

Dennis Vash
2020-03-29