用户偏好应以默认配置为基底,用接口数据安全浅合并;嵌套结构需深合并;合并后立即持久化存储,并加容错读取;防止重复合并与状态错乱。

接口返回的用户偏好设置,通常不能直接覆盖本地已有配置,而要“合并”——保留用户没改过的默认项,只更新接口明确返回的字段。关键在于区分哪些是服务端下发的、哪些是本地已有的、哪些该用默认值兜底。
用 Object.assign 做安全浅合并
接口返回的偏好(如 { theme: 'dark', lang: 'en' })往往只是部分字段。合并时应以本地默认配置为基底,再用接口数据覆盖:
- 先定义一套完整默认偏好:
const defaults = { theme: 'light', lang: 'zh-CN', zoom: 1, animations: true }; - 请求成功后,用
Object.assign({}, defaults, apiResponse)得到最终配置 - 务必用空对象作为第一参数,避免污染
defaults原始对象
处理嵌套结构需深合并
如果偏好包含嵌套对象(如 { ui: { theme: 'dark', fontSize: 'large' }, notifications: { email: true } }),Object.assign 会整块替换 ui,导致丢失未返回的子字段。
此时推荐两种方式:
- 前端统一要求后端返回扁平结构(如
ui_theme,ui_fontSize),规避嵌套问题 - 引入
lodash.merge或手写递归合并函数,确保ui内部字段逐层合并,而非整体覆盖
合并后立即同步到持久化存储
合并结果不能只存在内存里。要立刻存入 Cookie 或 localStorage,保证刷新后仍生效:
- 存 Cookie:用
js-cookie的Cookies.set('user_prefs', JSON.stringify(merged), { expires: 365, path: '/' }) - 存 localStorage:直接
localStorage.setItem('user_prefs', JSON.stringify(merged)) - 注意读取时加容错:
JSON.parse(localStorage.getItem('user_prefs') || '{}')
避免重复合并与状态错乱
用户可能在多个标签页操作偏好,或接口返回延迟。需防止多次合并引发冲突:
- 合并前检查接口响应是否为空或无效(如
!apiResponse || typeof apiResponse !== 'object') - 不盲目覆盖本地已修改但尚未提交的临时状态(如有编辑中未保存的设置,应提示或暂存)
- 若支持离线优先,可先读本地存储,再用接口数据增量更新,而非全量覆盖
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











