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

React Redux新手求助:如何手动编写Redux Persist的saveUserFilter函数?

手动实现redux-persist过滤Transform替代createFilter

你可以自己写一个符合redux-persist规范的transform对象,替代redux-persist-transform-filter的createFilter功能,彻底避开lodash.set的原型污染漏洞。具体实现如下:

// 定义需要保留的user字段
const allowedUserFields = ['username', 'displayName', 'timeZone'];

const saveUserFilter = {
  // 持久化到存储前的处理:只保留user下指定字段
  out: (state, key) => {
    if (key !== 'user') return state;
    if (!state) return state;
    
    const filteredState = {};
    allowedUserFields.forEach(field => {
      // 仅复制state自身存在的字段,避免原型链属性污染
      if (Object.prototype.hasOwnProperty.call(state, field)) {
        filteredState[field] = state[field];
      }
    });
    return filteredState;
  },
  // 从存储读取后的处理:直接返回过滤后的存储数据
  in: (state, key) => {
    if (key !== 'user') return state;
    return state;
  }
};

// 原persistConfig保持不变,替换transforms里的saveUserFilter即可
const persistConfig = {
  key: KEY,
  storage,
  whitelist: [
    'user',
    'timeZones',
  ],
  transforms: [ saveUserFilter ],
};

核心逻辑说明:

  • out方法:仅对user这个reducer的状态做处理,遍历允许的字段列表,只复制状态自身存在的字段到新对象,过滤掉不需要持久化的内容。用Object.prototype.hasOwnProperty.call是为了规避原型链属性的意外读取,提升安全性。
  • in方法:存储的数据已经是过滤后的安全内容,直接返回即可;如果需要在读取时合并现有状态的其他字段,可以在这里自定义合并逻辑(比如return {...currentState, ...state},不过redux-persist默认会自动合并状态,通常不需要额外操作)。

这个实现完全不依赖第三方库,既避免了漏洞风险,又完美复刻了你之前用createFilter实现的功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:40:14