-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Themeの問題 #5
Comments
next-themeというパッケージもあるが、suppressHydrationWarningを使うことが明記されている。
1レベル下までの警告を無視させるとあるが、あまり良いアプローチではない気がする... 実装例 |
この動画の通りに修正したけど、画面遷移すると変わらずちらついてしまう |
zustandを使ってみたけど結局はlocalstorageを使うので初期描画時にクライアントとサーバーとのギャップがあるという旨のエラーが出てしまう
|
Hydration failed...エラーになったコード app/layout.tsx
ThemeProvider.tsx
ThemeChanger.tsx
ThemeStore.tsx
|
geminiに聞いてみた ~~ Next.jsでテーマ切り替えを実装する際、 これまで様々な方法を試されたにも関わらず解決に至っていないとのこと、お気持ちお察しします。
過去2年間に公開されたNext.jsのテーマ切り替え実装例を探したところ、以下のリポジトリが見つかりました。 例1: next-themes を利用した実装
例2: Recoil + localStorage + useEffect を利用した実装
例3: context + localStorage + useEffect を利用した実装
これらの実装例を参考に、ご自身のコードを見直してみて下さい。
Hydrationエラーは、サーバーサイドとクライアントサイドでレンダリング結果が異なる場合に発生します。 そのため、 補足 上記以外にも、様々な実装方法が存在します。それぞれの実装方法にはメリット・デメリットがありますので、ご自身の状況に合わせて最適な方法を選択して下さい。 もし、具体的なコードについて相談したい場合は、お気軽にご質問下さい。 |
少なくとも例1と例3のアプローチはダメだった (例1についてはsuppressHydrationWarningを使うことが前提となっており、これに違和感を思って不採用とした) |
recoilを使おうとしたけどNextJSv15系(Reactv19系)はまだサポートしてなかった... |
画面遷移(または画面リフレッシュ)によるチラつきは公式サイトでも発生している(記載日時現在) qiitaによる解説を見つけた Hydration failedエラーはクライアントとサーバーとのギャップで発生しているエラーなので、qiitaの解説を見るとCookieを使ってそれを回避している |
やっとできた。。。 layout.tsx(つまりサーバーサイド)でnext/handersを使ってCookieを取得 js-cookieを使ってクライアントサイドでCookieを取得/変更 ただ、まだボタンの初期表示の問題があるので引き続き修正する |
テーマ切り替えボタンの初期設定ができた inputのcheckedをtrue/false設定すれば良い
|
コードは後で整理するとして、以下のPRで修正対応を行なった |
現状の実装だと、ライトモード中に画面遷移すると一瞬だけダークモードになってからライトモードに変わるという現象が起きている。
これはhtmlタグのdata-theme要素が初期表示時に設定されずに発生してしまっていることがわかっている。
themeの制御についてはdaisyUIを活用している
https://daisyui.com/components/theme-controller/
最終的な着地点として、画面遷移しても上記の現象が発生しなくなること。
The text was updated successfully, but these errors were encountered: