next.js store.getstate在下一个js中不是一个函数,如何在下一个js 13中摆脱这个?

9rygscc1  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(135)

我得到下面的错误Next.js是最新的
未处理的运行时错误:store.getState不是函数

"use client";

import { configureStore } from "@reduxjs/toolkit";
import productSlice from "./features/productSlice";

const persistedStateJson = localStorage.getItem("myState");

let persistedState = {};

if (persistedStateJson) {
  persistedState = JSON.parse(persistedStateJson);
}

const store = configureStore({
  reducer: {
    productSlice
  },
  preloadedState: persistedState,
});

//set local storage on store change
store.subscribe(() => {
  localStorage.setItem("myState", JSON.stringify(store));
});

export default store;

字符串
配置了redux存储

ewm0tg9j

ewm0tg9j1#

不幸的是,你忽略了堆栈跟踪,所以现在还不知道它是从哪里来的,但是这里我想指出两个一般性的问题,两者都源于相同的细微差别:

此组件是一个客户端组件,但它仍然会SSR,因为这就是Next.js对App Router所做的!

  • 这意味着导出的store常量将在所有用户和所有SSRed页面之间共享。您需要在组件内部创建这个store示例,并将其作为ref或本地组件状态保存,然后将其传递到Provider。不能将其作为模块级常量。
  • 这也意味着您的代码将出错,因为服务器上不存在localStorage。您需要将此代码 Package 到typeof window !== "undefined"检查中。
//set local storage on store change
if (typeof window !== "undefiend") {
  store.subscribe(() => {
    localStorage.setItem("myState", JSON.stringify(store));
  });
}

字符串
这也意味着这里的SSRed部分将始终以空存储开始(因为服务器无法访问用户浏览器的localStorage)。这可能会导致很多问题,因为服务器将呈现与客户端完全不同的标记。

相关问题