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

Redux中getDefaultMiddleware的ignore配置无效,仍报非可序列化值错误

解决Redux Toolkit中非可序列化值的检测错误

问题描述

使用Redux Toolkit时出现以下错误:

serializableStateInvariantMiddleware.ts:234 A non-serializable value was detected in an action, in the path:

原因是CustomItem中的dateTime字段为Dayjs实例(非可序列化类型),尝试通过ignoredPaths或ignoredActions配置忽略检查但未生效,希望忽略整个customs slice的序列化检测。

自定义Slice代码

interface CustomItem {
  dateTime: Dayjs
  // 其他字段
}
export interface SomeState {
  customVals: Array<CustomItem>; 
  // 其他状态字段
}

const initialState: SomeState = {
  customVals: new Array<CustomItem>(), 
  // 其他初始值
};
export const customsSlice = createSlice({
  name: 'customs',
  initialState,
  reducers: {
    updateCustoms: (state, action) => {
      // 处理customVals中的日期值
    },
  },
});

无效的Store配置

import customReducer from './CustomSlice';

export const store = configureStore({
    reducer: {
      customs: customReducer,
    },
    middleware: (getDefaultMiddleware) =>
      getDefaultMiddleware({
          serializableCheck: {
            ignoredPaths: ['customs.customVals'], // 尝试过['customs']
            // 也尝试过ignoredActions: ['customs/updateCustoms']
          },
        }),
});

解决方案

1. 彻底忽略整个customs slice的序列化检查

如果希望跳过整个customs slice的state和所有相关action的序列化检测,可以通过以下配置实现:

import customReducer from './CustomSlice';

export const store = configureStore({
  reducer: {
    customs: customReducer,
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: {
        // 忽略整个customs slice的state路径
        ignoredPaths: ['customs'],
        // 匹配所有customs slice的action类型(正则表达式)
        ignoredActions: /^customs\//,
        // 如果action的payload中存在非可序列化值,忽略整个payload的检查
        ignoredActionPaths: ['payload'],
      },
    }),
});

2. 针对具体路径精准忽略

如果不想完全忽略整个slice,可以更精准地指定忽略路径:

  • 忽略state中customVals数组的检查:ignoredPaths: ['customs.customVals']
  • 忽略updateCustoms action的payload里的customVals:ignoredActionPaths: ['payload.customVals']
  • 忽略单个action类型:ignoredActions: ['customs/updateCustoms']

3. 推荐方案:将非可序列化值转为可序列化类型

虽然忽略检查可以解决报错,但更推荐的做法是在存入state前将Dayjs对象转为字符串(如ISO格式),取出时再转回Dayjs实例,保证state的可序列化:

// 更新时转成字符串
const updateCustoms = (customItems: CustomItem[]) => {
  const serializedItems = customItems.map(item => ({
    ...item,
    dateTime: item.dateTime.toISOString()
  }));
  return customsSlice.actions.updateCustoms(serializedItems);
};

// 使用时转回Dayjs
const customVals = useSelector((state: RootState) => 
  state.customs.customVals.map(item => ({
    ...item,
    dateTime: dayjs(item.dateTime)
  }))
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:50:24