【发布时间】:2019-12-15 06:25:22
【问题描述】:
我正在尝试通过 React 的钩子使用 Context 和 Reducers,但遇到了钩子顺序不一致的问题。我的理解是,只要useHook(…) 的顺序保持不变,就可以在任何类型的控制流中调用返回的状态/更新函数/reducer。否则,我将在 FunctionComponents 的开头调用钩子。
是我在循环中生成Days 吗?还是遗漏了什么?
Warning: React has detected a change in the order of Hooks
called by Container. This will lead to bugs and errors if not fixed. For
more information, read the Rules of Hooks:
https://reactjs.org/docs/hooks-rules.html
Previous render Next render
------------------------------------------------------
1. useContext useContext
2. undefined useRef
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Container的完整版如下。下面是Day 的摘录,并有来自react-dnd 的useDrop 的参考。
export const Container: FunctionComponent<Props> = () => {
let events = useContext(State.StateContext)
//let events: Array<Event.Event> = [] <- with this, no warning
const getDaysEvents = (day: Event.Time, events: Array<Event.Event>) => {
return events.map(e => {
const isTodays = e.startTime.hasSame(day, "day")
return isTodays && Event.Event({ dayHeight, event: e })
})
}
let days = []
for (let i = 0; i < 7; i++) {
const day = DateTime.today().plus({ days: i })
days.push(
<Day key={day.toISO()} height={dayHeight} date={day}>
{getDaysEvents(day, events)}
</Day>
)
}
return <div className="Container">{days}</div>
}
摘自Day(Event 同样使用useDrag 钩子,也像这里一样在顶层调用)。
const Day: FunctionComponent<DayProps> = ({ date, height, children }) => {
const dispatch = useContext(State.DispatchContext)
const [{ isOver, offset }, dropRef] = useDrop({
// …uses the dispatch function within…
// …
})
// …
}
【问题讨论】:
-
这里没有看到 useRef ...
-
它在
Day组件内,而不是在Container 内。 -
该消息表明挂钩是由
Container调用的,而不是由“Day”调用的。这似乎很奇怪。Event.Event()有没有使用钩子? -
是的,它是
useDrag,在顶层。使用来自它的 ref,以及闭包中的监视器返回的值。很高兴包含它,不过它与Day和Container是一样的。 -
如果 Event.Event 是像 Day 这样的反应组件(我从您的评论中了解到),问题是您直接调用它
Event.Event()而不是返回 jsxreturn isTodays && <Event.Event dayHeight={dayHeight} event={e} />
标签: javascript reactjs typescript