[解決済み] "React has detected a change in the order of Hooks" しかし、Hookは順番に呼び出されているようだ
質問
を使おうとしています。
Context
と
Reducers
をReactのフック経由で実行したところ、フックの順番が一定でないという問題が発生しました。私の理解では、フックの順番が一定であれば
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
's
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…
// …
})
// …
}
解決方法は?
私のコメントを回答として書き込む
問題は、あなたが
Event.Event()
は、reactコンポーネントであるにもかかわらず、直接、このコンポーネントにアクセスします。そのため、関数内のフックコールをreactの一部として扱ってしまいます。
Container
の一部であることを意図しているにもかかわらず、そのようなことはありません。
解決策は、JSXを使用することです。
return isTodays && <Event.Event dayHeight={dayHeight} event={e} />
なぜこれがうまくいくかは、JSXを結果のJSコードに置き換えてみるとよくわかります。
return isTodays && React.createElement(Event.Event, { dayHeight, event: e })
参照 https://reactjs.org/docs/react-api.html#createelement . 関数コンポーネントを直接呼び出すことはありません。reactの仕組みは、常にコンポーネントへの参照をreactに渡し、適切なタイミングで関数を呼び出すようにします。
関連
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み] jQueryで、ユーザーがそのフィールドを編集している間、テキストフィールドの最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み】Jestが予期しないトークンに遭遇した
-
[解決済み】未定義のプロパティ 'forEach' を読み取ることができない
-
[解決済み】react router v^4.0.0 Uncaught TypeError: 未定義のプロパティ'location'を読み取れない
-
[解決済み] Uncaught (in promise) TypeError: フェッチに失敗してCorsエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】node.js TypeError: path must be absolute or specify root to res.sendFile [JSONのパースに失敗しました]。
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】Uncaught ReferenceError。Firebase は定義されていません。
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート