我的react 是新的,我面临着一个关于useContext的问题.

我想连接到一些API并从那里获取一些数据,并将其存储在上下文中.

因此,以下是负责此操作的MovieContextProvider.jsx文件:

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


const MovieContext = createContext();

const URL = "https://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=9813ce01a72ca1bd2ae25f091898b1c7";

function MovieContextProvider({ children }) {

    const [movieData, setMovieData] = useState();

    useEffect(() => {

        axios.get(URL)
            .then((response) => setMovieData(response.data.results))
            .catch((error) => console.log(error));

    }, []);


    return (

        <MovieContext.Provider value={movieData}>
            {children}
        </MovieContext.Provider>

    );
}

export default MovieContextProvider;

现在,我在另一个文件Movies.jsx中使用此上下文

import React from 'react';
//import MovieCard from '../Components/MovieCard';

import { useContext } from 'react';

import MovieContext from '../Contexts/MovieContextProvider';

function Movies() {

    const movieData = useContext(MovieContext);

    console.log(movieData); //Here I'm checking firstly if the data
                           //received properly from the context

    return (

        <div>

            Movies...
            
        </div>
    );
}

export default Movies;

最后,这是我的App.js%文件

import React from 'react';
import './App.css';

import { BrowserRouter, Routes, Route } from "react-router-dom";
import NavBar from './Components/NavBar';
import Home from './Components/Home';
import AboutUs from './Components/AboutUs';
import Movies from './Components/Movies';
import MovieContextProvider from './Contexts/MovieContextProvider';


function App() {
  return (
    <div className="App">

      <MovieContextProvider>
        <BrowserRouter>
          <NavBar></NavBar>

          <Routes>
            <Route path='/Movies' element={<Movies></Movies>}></Route>

            <Route path="/Home" element={<Home></Home>}></Route>

            <Route path="/AboutUs" element={<AboutUs></AboutUs>}></Route>

          </Routes>
        
        </BrowserRouter>
        
      </MovieContextProvider>
      


    </div>
  );
}

export default App;

现在的问题是,当我在Movies.jsx文件中记录movieData时,它的值是undefined.尽管如此,当我将它记录在MovieContextProvider.jsx内时,它看起来像预期的那样.

那么,我是不是用错了useContext(context)?我在网上做了很多研究,我在这里找到了一些关于Stack Overflow的文章,但我没有解决这个问题.

任何帮助都将不胜感激.

推荐答案

看起来您忘记了从101文件中导出MovieContext本身.您需要将其导出,以便可以在102文件中导入和使用它.

修改100文件以包括101的导出:

// other imports...
export const MovieContext = createContext();
// rest of your code...

然后在Movies.jsx中,您需要修改IMPORT语句以从正确的文件中导入:

import { MovieContext } from '../Contexts/MovieContextProvider';

现在,上下文应该在Movies组件中可用,并且您应该能够像预期的那样访问movieData.

另外,请注意,由于movieData是异步获取的,因此在获取数据并将其填充到上下文之前,它最初将是undefined.您可能希望包括加载状态或条件呈现来处理此问题.您可以调整Movies组件来处理此场景:

function Movies() {
    const movieData = useContext(MovieContext);

    if (!movieData) {
        return <div>Loading movies...</div>;
    }

    // rest of your code...
}

这样,组件将呈现加载消息,直到100可用.

Reactjs相关问答推荐

有正确的方法来设置我的金牛座应用程序的图标吗?

为什么我无法访问窗口事件处理程序中的状态?

在Redux工具包查询中,是否可以将标记应用到API切片内的所有端点?

将动态元素中的输入数据传输到Reaction

有没有一种惯用的方式来接受特定的子元素?

在构建或部署Reaction应用程序时出错

React,当我调用handleSubmit()函数时,我正在将application/json和multiform/data中的数据发送到后端,但student_image中没有数据:null

React useEffect 问题...异步函数内的变量正在获取延迟的更新值

如何在React组件中自动更新图表数据?

如何在不同的路由中渲染相同的页面组件(包括 getServerSideProps)

Next.js 和理智 | npm run build 时预渲染页面/时发生错误

在react的useEffect钩子中,我的函数被调用,但只有第一个函数能够改变状态,第二个函数无法改变状态.

当我使用 Firebase Auth 在 React 中刷新主页时显示登录页面

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

带有 webpack 错误多个文件匹配路由名称的 Expo-router.无法Bundle 或部署应用程序

我如何在所有组件中使用 Chakra UI toast?

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

页面加载时不显示数组中的数据

ReactJs 行和列

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