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

Next.js 14 集成Redux 5报错TypeError: store.getState is not a function如何解决?

问题描述

我在使用Next.js 14结合Redux实现购物车存储功能时遇到了如下错误:
Redux Provider错误

按照Redux官方Next.js文档编写的代码但未达到预期效果,请问该如何修复?我哪里出错了?

我的代码文件:

/store/index.js

import { configureStore } from '@reduxjs/toolkit'
import cartReducer from './cartSlice';

export const makeStore = () => {
    return configureStore({
        reducer: {
            cart: cartReducer
        }
    })
}

/app/StoreProvider.js

"use client"
import { useRef } from 'react'
import { Provider } from 'react-redux'
import { makeStore } from '../store'
// import { cartSlice } from '../store/cartSlice'

export function StoreProvider({ children }) {
    const storeRef = useRef()
    if (!storeRef.current) {
        // Create the store instance the first time this renders
        storeRef.current = makeStore()
    }

    return <Provider store={storeRef}>{children}</Provider>
}

/app/layout.js

import { Inter } from "next/font/google";
import "./globals.css";
import { StoreProvider } from "./StoreProvider.js";

const inter = Inter({ subsets: ["latin"] });

export const metadata = {
    title: "Shopping App",
    description: "Test Data Pro",
};

export default function RootLayout({ children }) {
    return (
        <StoreProvider>
            <html lang="en">
                <body className={inter.className}>{children}</body>
            </html>
        </StoreProvider>
    );
}

修复方案

你的代码存在两个关键错误,修正后即可解决问题:

1. 修正StoreProvider的Store传递

在StoreProvider组件中,你传递给Provider的是Ref对象本身,而不是Ref存储的实际Store实例。需要把store={storeRef}改为store={storeRef.current}:

修正后的/app/StoreProvider.js:

"use client"
import { useRef } from 'react'
import { Provider } from 'react-redux'
import { makeStore } from '../store'

export function StoreProvider({ children }) {
    const storeRef = useRef()
    if (!storeRef.current) {
        storeRef.current = makeStore()
    }

    return <Provider store={storeRef.current}>{children}</Provider>
}

2. 调整RootLayout的结构

Next.js 14要求RootLayout的顶层元素必须是<html>,你原来的代码把StoreProvider放在了<html>外面,违反了布局规则。需要将StoreProvider移到<body>内部:

修正后的/app/layout.js:

import { Inter } from "next/font/google";
import "./globals.css";
import { StoreProvider } from "./StoreProvider.js";

const inter = Inter({ subsets: ["latin"] });

export const metadata = {
    title: "Shopping App",
    description: "Test Data Pro",
};

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body className={inter.className}>
                <StoreProvider>{children}</StoreProvider>
            </body>
        </html>
    );
}

错误原因说明

  • 第一个错误:React-Redux的Provider组件需要接收有效的Redux Store实例,而你传递的是useRef返回的Ref对象,并非实际的Store,导致无法建立Redux上下文。
  • 第二个错误:Next.js的RootLayout有严格的结构要求,顶层必须是<html>标签,否则会触发框架内部的校验错误,同时可能影响组件的渲染上下文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:33:31