我正在try 上下文API,但它抛出一个错误,指出useAuth是未定义的.我试过很多方法,但都不管用.我已经被困了几个小时了. 以下是代码.

AuthContext.js

import React, { createContext, useContext, useState } from 'react';

const AuthContext = createContext();

export const AuthProvider = ({ children }) => {
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  const setAuth = (authBool) => {
    setIsAuthenticated(authBool)
  }

  return (
    <AuthContext.Provider value={{ isAuthenticated, setAuth }}>
      {children}
    </AuthContext.Provider>
  );
};

export const useAuth = () => {
  return useContext(AuthContext);
};

App.js

import {render} from "react-dom"    
import Cookies from "universal-cookie";
import React, { useEffect } from "react";
import { useAuth, AuthProvider } from './Contexts/Authcontext';


const cookies = new Cookies();

export default function App() {
  const { setAuth } = useAuth()
    useEffect(() => {
      getSession();
    }, []);
  
    const getSession = () => {
      fetch("/authorizer/session/", {
        credentials: "same-origin",
      })
        .then((res) => res.json())
        .then((data) => {
          console.log(data);
          setAuth(data.isAuthenticated);
        })
        .catch((err) => {
          console.log(err);
        });
    };

    return (
        <React.StrictMode>
            <AuthProvider>
                <div id="App">
                    My APP
                </div>
            </AuthProvider>
        </React.StrictMode>
    );
}

const appDiv = document.getElementById("main")
render(<App/>, appDiv)

我判断了拼写错误,判断了是否导出了上下文,两个都很好.

EDIT:个 我发现错误发生在JS中的以下行.它通过错误useAuth在下面的行处未定义.不知道原因,因为导入操作正确.

function App() {
  const {
    setAuth
  } = (0,_Contexts_Authcontext__WEBPACK_IMPORTED_MODULE_6__.useAuth)();

谢谢你的帮助

推荐答案

您看到的错误是由于组件树中的操作顺序造成的.

您试图在App组件中使用useAuth钩子,但App组件本身负责将其子组件包装在AuthProvider中.由于App本身尚未被AuthProvider包装,因此不能在App组件中使用依赖于AuthContext‘S上下文值的useAuth钩子.

要解决这个问题,您需要重新构造组件,使App组件(或您试图使用useAuth挂钩的任何组件)是由AuthProvider包装的组件的子组件.

这里有一种方法可以解决这个问题:

  1. 创建一个新的主组件,它用AuthProvider包装App组件:
// Root.js
import React from 'react';
import App from './App';
import { AuthProvider } from './Contexts/Authcontext';

function Root() {
  return (
    <React.StrictMode>
      <AuthProvider>
        <App />
      </AuthProvider>
    </React.StrictMode>
  );
}

export default Root;
  1. 现在,在您的主渲染代码中,渲染Root组件:
// main code
import { render } from 'react-dom';
import Root from './Root';

const appDiv = document.getElementById("main");
render(<Root />, appDiv);
  1. 保持您的App分量不变.现在,由于App是由AuthProvider包装的Root的子级,您应该能够在App组件中使用useAuth钩子,而不会出现任何问题.

这种重构确保了使用useAuth钩子的任何组件实际上都在AuthProvider的上下文中.

Javascript相关问答推荐

我的JS代码将按照哪个序列被解释

详细更改参考价值:"

如果被1个Phaser JS抵消,我的倾斜碰撞

React状态变量在使用++前置更新时引发错误

如何修复循环HTML元素附加函数中的问题?

为什么从liveWire info js代码传递数组我出现错误?

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

网页自检测外部元素无法加载

如何修复我的数据表,以使stateSave正常工作?

如何将数据块添加到d3力有向图中?

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

确保函数签名中的类型安全:匹配值

元素字符串长度html

将数组扩展到对象中

搜索功能不是在分页的每一页上进行搜索

为列表中的项目设置动画

如何修复使用axios运行TSC index.ts时出现的错误?

在SuperBase JS客户端中寻址JSON数据

如果NetSuite中为空,则限制筛选

React Refs不与高阶组件(HOC)中的动态生成组件一起工作