如何在Next.js App Router中使用全局提供程序

5rgfhyps  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(212)

在Next的经典Pages Router中,您可以在_app. js文件中添加全局提供程序,并将其 Package 在整个组件树中。这将确保提供程序可用于所有组件。
如果您使用应用程序路由器执行此操作,则会收到一条错误消息
您正在导入一个需要useState的组件。它只能在客户端组件中工作,但它的父组件都没有标记为“使用客户端”,因此它们默认为服务器组件。
有没有一种方法可以在不给予服务器组件的情况下实现类似的功能?

zc0qhyus

zc0qhyus1#

//在_app.js中使用context
//user.js

import { createContext, useState, useContext } from "react";

const Context = createContext();

const Provider = ({ children }) => {
  const [user, setUser] = useState(true);

  const exposed = {
    user,
  };

  return <Context.Provider value={exposed}>{children}</Context.Provider>;
};

export const useUser = () => useContext(Context);

export default Provider;

//_app.js

import UserProvider from "../context/user";

function MyApp({ Component, pageProps }) {
    return (
        <UserProvider>
            <Component {...pageProps} />
        </UserProvider>
    );
}
export default MyApp;

//像这样在任何组件中使用用户状态

import { useUser } from "../context/user";

export default function Home({ lessons }) {
  const { user } = useUser();
  console.log({ user });
  return (
    <div>
      
    </div>
  );
}
qvsjd97n

qvsjd97n2#

将提供程序 Package 在客户端组件中。

'use client';
 
import { SomeProvider } from 'some-library';
 
export function Providers({ children }) {
  return (
    <SomeProvider>
      {children}
    </SomeProvider>
  );
}

并在根布局中使用此 Package 的提供程序。

import { Providers } from './providers';
 
export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        <Providers>{children}</Providers>
      </body>
    </html>
  );
}

相关问题