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

React Redux提示组件未包裹Provider 实际已包裹仍报错如何解决

错误根因

你调用useSelector、useDispatch这两个React Redux Hooks的时机不对:这两个Hook只能在被<Provider>包裹的组件树内部运行,你当前是在MyApp组件的顶层直接调用这两个Hook,但<Provider>是写在MyApp的返回内容里的,MyApp本身没有被Provider覆盖,自然找不到Redux上下文就会抛出这个报错。

修复方案

把身份认证相关的逻辑抽离为独立子组件,MyApp仅负责渲染Provider包裹的结构即可,修复后的代码如下:

import 'tailwindcss/tailwind.css';
import '../styles/global.css';
import Router from 'next/router';
import ProgressBar from "@badrap/bar-of-progress";
import React, { useEffect } from "react";
import { auth } from '../firebase';
import { useDispatch, useSelector, Provider } from "react-redux";
import { store } from '../src/app/store'
import { login, logout, selectUser } from "./userSlice";

// 抽离身份认证逻辑为独立组件,放在Provider内部运行
function AuthProvider({ children }) {
    const user = useSelector(selectUser);
    const dispatch = useDispatch();

    useEffect(() => {
      const unsubscribe = auth.onAuthStateChanged(userAuth => {
        if(userAuth) {
          dispatch(
            login({
            uid: userAuth.uid,
            email: userAuth.email
          })
          );
        } else {
          dispatch(logout);
        }
      });
      return unsubscribe;
    }, [dispatch]);

    return children
}

function MyApp({ Component, pageProps }) {
    return (
      <Provider store={store}>
        <AuthProvider>
          <Component {...pageProps}/>
        </AuthProvider>
      </Provider>
    )
}

export default MyApp

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:45:03