Действительно, правила перехвата гласят:
https://reactjs.org/docs/hooks-rules.html
Только перехватчики вызовов на верхнем уровне
Дон 'Вызов Хуки внутри циклов, условий или вложенных функций.Вместо этого всегда используйте Hooks на верхнем уровне вашей функции React.Следуя этому правилу, вы гарантируете, что хуки вызываются в одном и том же порядке каждый раз при рендеринге компонента.Это то, что позволяет React правильно сохранять состояние хуков между несколькими вызовами useState и useEffect.(Если вам интересно, мы объясним это более подробно ниже.)
Это необходимо для React, чтобы быть уверенным, что хуки будут вызываться на точно в том же порядке в каждом цикле рендеринга.
Кажется, что Modal
вызовет useTop
только после монтирования (открытия), то есть, вероятно, пропустит первый рендеринг, нарушая правило хуков и портя порядок.
Одна вещь, которую вы можете попробовать:
Передайте ref
для вашего useTop
крючка и обработайте его внутри него.Если он нулевой, ничего не делать, если он уже смонтирован, подключите прослушиватель и верните функцию очистки.
const Panel = () => {
const newTop = useTop(contentRef);
<Modal pos={newTop} onAfterOpen={null}><div ref={contentRef}>Test</div></Modal>
};