Next.js技术求助:useEffect钩子从未执行
问题:Next.js中Context Provider的useEffect不执行,组件重复渲染
我在Next.js应用里集成socket.io,遇到问题后把代码精简到基础版本排查,结果更困惑了。我将socket放在根布局<body>直接子元素的Context Provider中以包裹整个应用(此前存在socket无限新建连接问题),已精简Provider代码。
当前问题:控制台打印三次******************* render socket provider *******************,但******************* socket provider useEffect *******************从未输出。后续在首页添加useEffect,该钩子同样未执行。
相关代码
根布局文件
import { SocketProvider } from "../hooks/useSocket"; import "./globals.css"; export const metadata = { title: "Title", description: "Description", }; export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( <html lang="en"> <body> <SocketProvider> <> {children}</> </SocketProvider> </body> </html> ); }
初始首页
import { Inter } from "next/font/google"; const inter = Inter({ subsets: ["latin"] }); export default function Home() { return ( <main className="relative h-full flex-grow"> <p>empty page</p> </main> ); }
Context Provider代码
"use client"; import React, { createContext, useContext, useEffect, } from "react"; type SocketContextProps = {}; const SocketContext = createContext<SocketContextProps>({}); export const SocketProvider = ({ children }: { children: JSX.Element }) => { console.log( "******************* render socket provider *******************" ); useEffect(() => { console.log( "******************* socket provider useEffect *******************" ); }, []); return ( <SocketContext.Provider value={{}}> {children} </SocketContext.Provider> ); }; export default function useSocket() { return useContext(SocketContext); }
修改后的首页
"use client"; import { useEffect } from "react"; export default function GameHome() { console.log("^^^^^^^ Home Page ^^^^^^^^^"); useEffect(() => { console.log("$$$$$$$$ Home page useEffect $$$$$$$$$$"); }, []); return ( <main className="relative h-full flex-grow"> <p>empty page</p> </main> ); }
控制台输出
wait - compiling... wait - compiling /[game-slug]/page (client and server)... event - compiled client and server successfully in 6.1s (634 modules) ******************* render socket provider ******************* ******************* render socket provider ******************* ^^^^^^^ Home Page ^^^^^^^^^ ******************* render socket provider *******************
内容的提问来源于stack exchange,提问作者Tsabary
相关产品推荐
相关产品推荐

