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

Next.js中用Provider包裹App时出现react-redux上下文值未找到错误怎么办?

Next.js中Redux Provider包裹App时的useDispatch错误解决

我在Next.js里尝试用Provider包裹外层App,想实现页面刷新时自动向后端发请求,这是我能想到的最简单的实现方式。参考相关建议加了wrapper并把组件传入App函数后,碰到了这个错误:

Error: could not find react-redux context value; please ensure the component is wrapped in a

无法正常运行的代码如下:

import { useEffect } from 'React';
import { useDispatch } from 'react-redux'
import Router from 'next/router';
 
// redux
import { store } from '../store/store';
import { Provider } from 'react-redux'

import { UserInfoAsync } from '../store/reducers/user';
 

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

export default function App({ Component, pageProps }) {
  const dispatch = useDispatch()
  useEffect(() => {
    dispatch(UserInfoAsync());
  },[])

  return (
     <AppWrapper {...Component} {...pageProps} />
  )
}

//<Provider store={store}>
//export default wrapper.withRedux(MyApp)

问题原因

你在App组件里直接调用了useDispatch,但此时App还没被Provider包裹——AppWrapper是在App的return里才渲染的,也就是说App本身处于Redux上下文之外,自然找不到context值,触发报错。

修复方案

把需要执行dispatch的逻辑移到Provider内部的组件里,让Redux上下文先生效,再调用hooks。

修改后的代码示例:

import { useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { store } from '../store/store';
import { Provider } from 'react-redux';
import { UserInfoAsync } from '../store/reducers/user';

// 内部组件,处于Provider包裹范围内
function AppContent({ Component, pageProps }) {
  const dispatch = useDispatch();
  
  useEffect(() => {
    // 页面刷新时触发请求
    dispatch(UserInfoAsync());
  }, []);
  
  return <Component {...pageProps} />;
}

export default function App({ Component, pageProps }) {
  return (
    <Provider store={store}>
      <AppContent Component={Component} pageProps={pageProps} />
    </Provider>
  );
}

或者也可以合并逻辑,直接在Provider内部处理:

import { useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { store } from '../store/store';
import { Provider } from 'react-redux';
import { UserInfoAsync } from '../store/reducers/user';

export default function App({ Component, pageProps }) {
  return (
    <Provider store={store}>
      {/* 用匿名组件包裹,确保在Provider内调用hooks */}
      <>
        {(() => {
          const dispatch = useDispatch();
          useEffect(() => {
            dispatch(UserInfoAsync());
          }, []);
          return <Component {...pageProps} />;
        })()}
      </>
    </Provider>
  );
}

核心原则:所有使用useDispatch/useSelector的组件或逻辑,必须放在<Provider>的子层级里,这样才能获取到Redux的上下文。

内容的提问来源于stack exchange,提问作者Lukas Guldstøv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:48:19