React中IndexedDB的getByID与getByIndex方法无法正常使用排查
可能的问题及解决方法
1. useEffect依赖缺失导致初始ID错误
你的useEffect使用了空依赖数组[],仅在组件挂载时执行一次。如果currentDate或UserInfo.id是异步获取的(比如从接口、localStorage读取,或是父组件传递的延迟props),挂载时它们可能还未拿到有效值,拼接出的dateAndId会是无效格式(比如undefined-123),自然查不到对应数据。
解决:
将currentDate和UserInfo.id加入依赖数组,同时增加有效性判断,确保只有值合法时才执行查询:
useEffect(() => { if (currentDate && UserInfo.id) { const targetId = `${currentDate}-${UserInfo.id}`; getByID(targetId).then(data => { data && UserInfo.setParameters(data); }); } }, [currentDate, UserInfo.id]);
2. currentDate格式不统一
如果currentDate是Date对象,直接拼接会生成带时区的完整字符串(比如Wed May 20 2024 14:30:00 GMT+0800 (中国标准时间)),而执行update时的currentDate可能已被格式化为纯日期字符串(比如2024-05-20),导致两次生成的dateAndId完全不匹配。
解决:
统一日期格式化规则,确保查询和更新时使用完全一致的字符串:
// 统一转为YYYY-MM-DD格式 const formatDate = (date) => new Date(date).toISOString().split('T')[0]; // update时使用 const updateId = `${formatDate(currentDate)}-${UserInfo.id}`; // getByID时同步使用 const queryId = `${formatDate(currentDate)}-${UserInfo.id}`;
3. 第三方IndexedDB库的方法适配问题
如果getByID是第三方库(如dexie.js)提供的方法,需确认该方法是否支持自定义keyPath的字符串主键。部分库的getByID默认针对自增数字主键,对于自定义字符串主键,需要改用通用的get()方法。
解决:
以dexie.js为例,直接调用表的get()方法查询:
// 假设数据库实例为db db.dataTime.get(`${currentDate}-${UserInfo.id}`).then(data => { UserInfo.setParameters(data); });
4. 存储数据与查询值不匹配
虽然update提示成功,但实际存储的dateAndId可能和你预期的不一致。可以打开浏览器DevTools的Application > IndexedDB,直接查看存储的数据,确认dateAndId的值和查询时传入的是否完全一致(注意大小写、空格、特殊字符等细节)。
内容的提问来源于stack exchange,提问作者hermi

