実現したいこと
Next.jsのルートコンポーネント(page.js及びlayout.js)をパフォーマンス向上の為SSRにしたいです。
layout.jsをSSRにしながら、state等を利用するような方法が知りたいです。
発生している問題・分からないこと
元々layout.jsでuseStateやuseEffectを使用していたので外部コンポーネントに移すようにしました。
AIに聞きながら進めましたが、私の理解が浅いせいかむしろ状況が複雑になってしまいました。
カスタムフックにすれば問題ないと提案され実装→CSRにしないとエラーになることが判明
useContextで管理すれば問題ないと提案され実装(念入りに確認)→恐らくですが、、CSRにしないとエラーになりそうです。
コード等は本件に関係しそうな一部のみ公開していますので、追加の情報が必要な場合はお申し付けください。
エラーメッセージ
error
1Error: (0 , react__WEBPACK_IMPORTED_MODULE_4__.useContext) is not a function
該当のソースコード
layout.js
1import "./globals.css"; 2import Header from './Components/Header/Header'; 3import { Provider } from 'react-redux'; 4import store from './Redux/store'; 5import { useContext } from "react"; 6import { LayoutStateContext, LayoutStateProvider } from "./Components/Hokks/LayoutContext"; 7 const Layout = ({ children }) => { 8 const { currentPage, isMounted } = useContext(LayoutStateContext); 9 10 if (!isMounted) { 11 return null; 12 } 13 14 return ( 15 <html lang="ja"> 16 <body className='max-w-screen-2xl mx-auto h-full w-full scroll-smooth'> 17 <Provider store={store}> 18 <LayoutStateProvider> 19 <Header currentPage={currentPage} /> 20 {children} 21 </LayoutStateProvider> 22 </Provider> 23 </body> 24 </html> 25 ) 26 } 27export default Layout
LayoutContext.js
1"use client"; 2import { usePathname } from 'next/navigation'; 3import { createContext, useContext, useEffect, useState } from 'react' 4 5const LayoutStateContext = createContext(); 6 7 const LayoutStateProvider = ({ children }) => { 8 const [currentPage, setCurrentPage] = useState(""); 9 const [isMounted, setIsMounted] = useState(false); 10 const path = usePathname(); 11 12 useEffect(() => { 13 setCurrentPage(path === "/" ? "" : "Chat"); 14 setIsMounted(true); 15 }, [path]); 16 17 return ( 18 <LayoutStateContext.Provider value={{ currentPage, isMounted}}> 19 {children} 20 </LayoutStateContext.Provider> 21 ); 22}; 23 24export { LayoutStateContext, LayoutStateProvider };
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
解決できず、良い解消法も思い浮かばずです。
補足
バージョン
next :^14.2.20
react:^18.3.1

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/01/11 04:15
2025/01/11 10:22