如何在NGRX Reducer中为新项生成唯一ID?当前实现是否合理?
使用Math.random()生成待办项唯一ID是否可行?
直接结论:这种做法不可靠,不推荐使用,具体原因和替代方案如下:
为什么Math.random()不适合做唯一ID?
- 重复风险:Math.random()返回0-1之间的浮点数,虽然重复概率极低,但并非绝对不可能。一旦出现ID重复,后续删除、更新待办项时会无法精准定位目标,引发逻辑错误。
- 类型不一致:你现有初始数据的ID是整数类型(1、2),但Math.random()生成的是浮点数,类型不统一会增加后续维护成本,比如ID比较时可能出现隐式类型转换的问题。
- 可读性差:浮点数ID不利于调试和问题定位,远不如自增ID这类直观的标识清晰。
推荐的替代方案
1. 自增整数ID(最适合当前场景)
利用现有待办列表的长度生成自增ID,完全适配你现有数据的类型,且不会出现重复:
on(TodoActions.addTodo, (state, { text }) => ({ ...state, todos: [ ...state.todos, { id: state.todos.length + 1, // 替换Math.random() task: `任务${state.todos.length + 1}`, // 替换无意义的随机字符串 description: text, completed: false, }, ], })),
2. 时间戳+随机数(适配页面刷新/本地存储场景)
如果你的待办数据需要持久化(比如存在localStorage),页面刷新后自增ID会重置,这时可以用时间戳搭配小范围随机数:
id: Date.now() + Math.floor(Math.random() * 1000),
3. 标准UUID(大型应用首选)
对于更严谨的生产环境,可以引入UUID生成库(如uuid),生成符合标准的唯一标识符,几乎不存在重复可能:
// 先安装依赖:npm install uuid import { v4 as uuidv4 } from 'uuid'; // 生成ID id: uuidv4(),
内容的提问来源于stack exchange,提问作者Snorlax
相关产品推荐
相关产品推荐

