我正在try 开始使用React上下文挂钩,我似乎有一个我不理解的问题.

我定义了一个用户上下文,它只是一个表示"hello user"的字符串:

import { useContext, createContext } from "react"

export const UserContext = createContext<string | null>(null)

export interface IAuth {
  children: React.ReactNode;
}

const Auth: React.FC<IAuth> = (props) => {

  return(
    <UserContext.Provider value={"hello user"}>
      {props.children}
    </UserContext.Provider>
  )
}

export default Auth

然后我试图访问的是这样的:

const Dash: NextPage<dashPageProps> = (props) => {

  const contextMsg = useContext(UserContext)

  const submitForm = () => {
    console.log("logout")
  }

  return (
    <Auth>
    <div className="w-screen">
      <div className='text-xl'>
        Dashboard
      </div>
      <h1>{contextMsg}</h1>
      <button className='bg-gray-400 border-2 border-gray-600 w-fit mt-5' onClick={submitForm} >Log out</button>
    </div>
    </Auth>
  )
}

export default Dash

但是,即使我在使用UserContext.Provider时设置了一个值,也没有打印出任何内容.如果我在创建上下文时指定一个值,而不是通过提供程序设置它,那么它将有一个值.

我做错了什么?

推荐答案

您的Auth在组件中被调用,但您在Auth使用之前调用useContext,这意味着您的上下文API尚未初始化

在通常的组件中,可以使用组件包装器初始化它们,如

<Context.Provider>
  <YourComponent/> // you call `useContext` in `YourComponent`
</Context.Provider>

但在接下来的时间里.尤其是在页面级组件下,由于干净的代码问题,js不是构建多个上下文API的好方法

我建议您将Auth移动到_app.tsx,如下所示,这将帮助您在所有页面级组件呈现之前初始化上下文API

export default function MyApp(props: AppProps) {
  const { Component, pageProps } = props

  return (
    <React.Fragment>
      <Auth>
        <Component {...pageProps} />
      </Auth>
    </React.Fragment>
  )
}

猛冲tsx

const Dash: NextPage<dashPageProps> = (props) => {

  const contextMsg = useContext(UserContext)

  const submitForm = () => {
    console.log("logout")
  }

  return (
    <div className="w-screen">
      <div className='text-xl'>
        Dashboard
      </div>
      <h1>{contextMsg}</h1>
      <button className='bg-gray-400 border-2 border-gray-600 w-fit mt-5' onClick={submitForm} >Log out</button>
    </div>
  )
}

export default Dash

Typescript相关问答推荐

使用ngrok解析Angular 时出现HTTP故障

React typescribe Jest调用函数

Redux—Toolkit查询仅在不为空的情况下添加参数

类型脚本类型字段组合

异步动态生成Playwright测试,显示未找到测试

类型脚本`Return;`vs`Return unfined;`

无法正确推断嵌套泛型?

在对象中将缺省值设置为空值

ANGLE独立组件布线错误:没有ActivatedRouting提供程序

Select 下拉菜单的占位符不起作用

在类型脚本中创建泛型类型以动态追加属性后缀

Vue3 Uncaught SyntaxError:每当我重新加载页面时,浏览器控制台中会出现无效或意外的令牌

正确使用相交类型的打字集

TYPE FOR ARRAY,其中每个泛型元素是单独的键类型对,然后在该数组上循环

在REACT查询中获取未定义的isLoading态

如何使用angular15取消选中位于其他组件中的复选框

如何处理可能为空的变量...我知道这不是Null?

可以将JS文件放在tsconfig';s includes/files属性?或者,我如何让tsc判断TS项目中的JS文件?

如何使用useSearchParams保持状态

如何在由函数参数推断的记录类型中具有多个对象字段类型