我是新手,我正在通过一个简单的例子学习如何使用useContext挂钩.

让我简单地解释一下我正在做的事情:

我正在从jsonPLACEHOLDER检索数据,并且希望通过useContext将检索到的对象传递给另一个组件(因此不使用props ).

我得到的100分如下:

'UsersContext' is not defined

代码如下:

App.js

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

export default function App() {
  const [users, setUsers] = useState([]);

  const UsersContext = createContext();

  useEffect(async () => {
    await fetch('https://jsonplaceholder.typicode.com/users')
      .then(response => response.json())
      .then(json => setUsers(json))
  }, [])

  return (
    <UsersContext.Provider value={users}>
      <h1>Hello</h1>
      <ListUser />
    </UsersContext.Provider>
  )
}

ListUser.js

import ListUser1 from './ListUser1';

export default function ListUser(props) {
    return (
        <>
            <h1>Component ListUser</h1>
            <ListUser1 />
        </>
    )
}

ListUser1.js

import { useContext } from "react";

export default function ListUser1() {
    const users = useContext(UsersContext);
    return (
        <>
            <h1>Component ListUser1</h1>
            {
                users.map((user) =>
                    <h4>{user.name}</h4>)
            }
        </>
    );
}

推荐答案

您需要从定义上下文的文件(在您的情况下为App.js)中导出上下文,并将其导入您正在使用的ListUser1.js中的文件中.

所以你的App.js可能是这样的:

import React, { useEffect, useState, createContext } from 'react';
import ListUser from './ListUser' // This import was missing too!

// Create and EXPORT the context here
export const UsersContext = createContext();

export default function App() {
  const [users, setUsers] = useState([]);

  // You can't pass an async function to useEffect (you don't need it anyway!)
  useEffect(() => {
    fetch('https://jsonplaceholder.typicode.com/users')
      .then(response => response.json())
      .then(json => setUsers(json))
  }, [])

  return (
    <UsersContext.Provider value={users}>
      <h1>Hello</h1>
      <ListUser />
    </UsersContext.Provider>
  )
}

最后,将此行添加到ListUser1.js:

import { UsersContext } from "./App";

备注:

  • 请注意,我还修复了您的useEffect,所以它不会收到async函数.
  • 这里有一个代码的工作版本:https://codesandbox.io/s/wonderful-oskar-mh5m8m
  • 如果在单独的文件中定义上下文,这可能是一种更好的做法.这将避免循环进口.

Reactjs相关问答推荐

过滤对象数组并通过迭代对象数组将属性放入新数组

TypeError:SearchProduct.get()获得了意外的关键字参数查询'

为什么我的React App.js只在页面刷新时呈现3次?

阻止组件更新的多分派Redux Thunk或setState是否有任何问题

react -无法获取函数的最新参数值

Github 操作失败:发布 NPM 包

无法通过 fetch 获取数据到上下文中

React Router v6 路径中的符号

运行 npm run build 出现问题

在 reactJS 中导航时页面重新加载

我应该如何将字符串作为props 传递给 React 组件?

改变输入的默认值时出现问题:number react-hook-form

Formik onChange() 字段挂钩覆盖显示值和 Select 机制

React - 使用 React 显示错误和积极alert

ReactJS 动态禁用按钮

Cypress 组件测试不渲染react 组件(但它的内容)

Wordpress 插件在激活时创建一个 React Public 页面

如何通过单击多个选项中的特定项目在模态上呈现不同的标题?

如何制作基于对象 struct 呈现数据的可重用组件?

运行开发服务器时如何为 Vite 指定运行时目录