以下是位于同一目录中的我的组件:

// App.js
import "./styles.css";
import React, { useState } from "react";
import Nav from "./Nav";
import { AppProvider } from "./context";

export default function App() {
  const [signedIn, setSignedIn] = useState(true);

  return (
    <div className="App my-3">
      <AppProvider>
        <Nav />
        <h2 className="my-2">{signedIn ? "Signed In!" : "Signed Out!"}</h2>
      </AppProvider>
    </div>
  );
}


// Nav.js
import Btn from "./Btn";

const Nav = () => {
  return <Btn />;
};

export default Nav;


// Btn.js
import "bootstrap/dist/css/bootstrap.min.css";
import { useContext } from "react";
import { context } from "./context";

const Btn = () => {
  const [signedIn, setSignedIn] = useContext(context);
  const handleButtonClick = () => {
    setSignedIn((prevState) => !prevState);
  };

  return (
    <button className="btn btn-primary" onClick={handleButtonClick}>
      {signedIn ? "Signed In!" : "Signed Out!"}
    </button>
  );
};

export default Btn;


// context.js
import React, { useState } from "react";

const context = React.createContext();

const AppProvider = ({ children }) => {
  const [signedIn, setSignedIn] = useState(true);

  return (
    <context.Provider value={[signedIn, setSignedIn]}>
      {children}
    </context.Provider>
  );
};

export { context, AppProvider };

这个问题只有在我try 创建单独的Conext.js文件时才出现.当代码如下所示时,它完全可以正常工作:

// App.js
import "./styles.css";
import React, { useState } from "react";
import Nav from "./Nav";

export const context = React.createContext();

export default function App() {
  const [signedIn, setSignedIn] = useState(true);

  return (
    <div className="App my-3">
      <context.Provider value={[signedIn, setSignedIn]}>
        <Nav />
        <h2 className="my-2">{signedIn ? "Signed In!" : "Signed Out!"}</h2>
      </context.Provider>
    </div>
  );
}


// Btn.js
import "bootstrap/dist/css/bootstrap.min.css";
import { useContext } from "react";
import { context } from "./App";

const Btn = () => {
  const [signedIn, setSignedIn] = useContext(context);
  const handleButtonClick = () => {
    setSignedIn((prevState) => !prevState);
  };

  return (
    <button className="btn btn-primary" onClick={handleButtonClick}>
      {signedIn ? "Signed In!" : "Signed Out!"}
    </button>
  );
};

export default Btn;

你能帮帮我吗?我仍然是一个react 的初学者,所以我不确定我应该做些什么来克服这个错误.我试了几种方法,但似乎都不管用

推荐答案

想要使用上下文中的值的组件必须明确表示他们想要它.您需要将h2包装在另一个函数组件中,并声明它希望使用上下文,如下所示:

import React, { useContext } from "react";
import Btn from "./Btn.js";
import { AppProvider, context } from "./Context";

const H2 = () => {
  const [signedIn] = useContext(context);
  return <h2 className="my-2">{signedIn ? "Signed In!" : "Signed Out!"}</h2>;
};

export default function App() {
  return (
    <div className="App my-3">
      <AppProvider>
        <Btn />
        <H2 />
      </AppProvider>
    </div>
  );
}

演示:

Edit clever-lumiere-mnsrrd

Reactjs相关问答推荐

NextJs Form不允许我输入任何输入,

NextJS(AppRouter)、Apollo(客户端),在根布局中使用ApolloProvider时出错

react 下拉菜单任务

如何在Reac.js中通过子组件和props 调用父组件函数?

有没有一种方法可以在没有强烈动画的情况下有条件地渲染组件?

React Router:在没有手动页面刷新的情况下,路由不会更新内容

折叠并重新打开react 手风琴将重置内部状态

使用以Jest 的方式返回 Promise 的方法来模拟可构造的 API 类时出现问题

修改React数据表扩展组件

CORS策略:对预检请求的响应未通过访问控制判断:没有Access-Control-Allow-Origin

React - 将一个充满空值的无限大小的数组存储在 ref 中是否可以,或者我应该重置数组吗?

在 React JS 中编辑表格数据

AWS 全栈应用程序部署教程构建失败

null 不是对象(判断RNSound.IsAndroid)

当从数组中删除数据时,UseEffect 不会重新渲染,仅在添加数据时才会重新渲染

list 组件未按预期运行

为什么我在此代码段中看不到 useEffect for count = 1?

使用 React、Redux 和 Firebase 的无限循环

为什么我在运行一些 npm react 命令时会收到这些警告?

单击按钮时获取react 表中每一行的属性