You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React useContext返回值为undefined问题求助

React useContext获取数据为undefined的问题解决

问题根源

你犯了Context导出与导入的关键错误:

  • 在MovieContextProvider.jsx中,你创建了MovieContext但未导出它,仅导出了Provider组件。
  • 在Movies.jsx中,错误地将MovieContextProvider组件当作Context对象传入useContext,导致useContext无法识别正确上下文,最终返回undefined。

修复步骤

1. 修改MovieContextProvider.jsx,导出MovieContext

在文件末尾添加MovieContext的导出,同时建议给useState设置空数组作为初始值,避免未加载时出现undefined:

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>
    );
}

// 同时导出Context和Provider
export { MovieContext };
export default MovieContextProvider;

2. 修改Movies.jsx,正确导入MovieContext

将导入的MovieContextProvider替换为MovieContext:

import React from 'react';
import { useContext } from 'react';
// 导入正确的MovieContext
import { MovieContext } from '../Contexts/MovieContextProvider';

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

    console.log(movieData);

    return (
        <div>
            Movies...
            {/* 可添加电影渲染逻辑 */}
            {movieData.map(movie => (
                <div key={movie.id}>{movie.title}</div>
            ))}
        </div>
    );
}

export default Movies;

额外优化建议

  • 可以在Provider中添加isLoading状态,在Movies组件中显示加载提示,避免用户看到空白页面:
// 在MovieContextProvider中新增状态
const [isLoading, setIsLoading] = useState(true);

useEffect(() => {
    axios.get(URL)
        .then((response) => {
            setMovieData(response.data.results);
            setIsLoading(false);
        })
        .catch((error) => {
            console.log(error);
            setIsLoading(false);
        });
}, []);

// 传递多个状态到上下文
return (
    <MovieContext.Provider value={{ movieData, isLoading }}>
        {children}
    </MovieContext.Provider>
);

在Movies组件中使用加载状态:

const { movieData, isLoading } = useContext(MovieContext);

if (isLoading) return <div>加载中...</div>;

内容的提问来源于stack exchange,提问作者Ninja_Tuna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:37:31