我希望将useUser返回的Auth0(Auth0)User对象存储在Reaction上下文API中. 以下是我的userConext.tsx,目标是能够在我的应用程序中全局访问User内的对象:

import { createContext, useContext } from "react";
import { useUser, UserProfile } from "@auth0/nextjs-auth0/client";

type UserContextType = {
  user: UserProfile | undefined;
  error: Error | undefined;
  isLoading: boolean;
};

const UserContext = createContext<UserContextType | null>(null);

export const UserProvider = ({ children }: { children: React.ReactNode }) => {
  const { user, error, isLoading } = useUser();

  return (
    <UserContext.Provider value={{ user, error, isLoading }}>
      {children}
    </UserContext.Provider>
  );
};

export const useUserContext = () => useContext(UserContext);

和下面的my_app.tsx:

import { AppProps } from "next/app";
import "../styles/globals.css";
import { UserProvider } from "@src/components/common/userContext";

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

我一直收到的错误是:

Unhandled Runtime Error
Error: You forgot to wrap your app in <UserProvider>

虽然我确实把我的应用程序

推荐答案

正如 comments 中所说,你需要拨打一次S useUser,并存储数据,然后从你的store 读取.

首先,我们需要包装调用useUserxUserProvider的组件,以便能够使用useContext钩子进行读取.

import { AppProps } from "next/app";
import "../styles/globals.css";
import { MyUserProvider } from "@src/components/common/userContext";
import { UserProvider } from "@auth0/nextjs-auth0/client";


export default function App({ Component, pageProps }: AppProps) {
  return (
    <UserProvider>
      <MyUserProvider>
        <Component {...pageProps} />
      </MyUserProvider>
    </UserProvider>
  );
}

然后,我们可以调用useUser并将其传递给我们的上下文:

import { createContext, useContext } from "react";
import { useUser, UserProfile } from "@auth0/nextjs-auth0/client";

type UserContextType = {
  user: UserProfile | undefined;
  error: Error | undefined;
  isLoading: boolean;
};

const UserContext = createContext<UserContextType | null>(null);

export const MyUserProvider = ({ children }: { children: React.ReactNode }) => {
  const { user, error, isLoading } = useUser();

  return (
    <UserContext.Provider value={{ user, error, isLoading }}>
      {children}
    </UserContext.Provider>
  );
};

export const useUserContext = () => {
  const context = useContext(UserContext);

  if (context === null /* the initial value */) {
    throw new Error("You probably forgot to wrap your app in <MyUserProvider>")
  }

  return context;
}

Javascript相关问答推荐

如何将拖放功能添加到我已自定义为图像的文件输入HTML标签中?

如何通过在提交时工作的函数显示dom元素?

使用TMS Web Core中的HTML模板中的参数调用过程

Promise Chain中的第二个useState不更新

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

我怎么在JS里连续加2个骰子的和呢?

将核心模块导入另一个组件模块时存在多个主题

使用getBorbingClientRect()更改绝对元素位置

在css中放置所需 colored颜色 以填充图像的透明区域

有没有办法更改Chart.js 3.x.x中主要刻度的字体?

用Reaction-RT-Chart创建实时条形图

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧

输入数据覆盖JSON文件

如何调整下拉内容,使其不与其他元素重叠?

如果查询为空,则MongoDB将所有文档与$in匹配

Rails 7:在不使用导入映射的情况下导入Java脚本

使用Java脚本筛选数组中最接近值最小的所有项

鼠标进入,每秒将图像大小减小5%

为什么我的Reaction组件不能使用createBrowserRouter呈现?

我正在为我的单选按钮在HTML中设置一个值.使用Java脚本,我如何才能获得该值?