Firebase读取数据数组时报undefined is not an object问题咨询
问题原因分析
- 首次渲染时异步请求未完成:你的数据请求是在
useEffect回调中发起的,属于组件挂载完成后才执行的异步逻辑,组件首次渲染时请求还没返回结果,trackScreenData还没被赋值,此时trackscreenData.data本身就是undefined。直接打印trackscreenData.data只会输出undefined不会触发报错,但访问trackscreenData.data[0]相当于对undefined取下标,自然会抛出类型错误。 - 热重载的状态保留特性:你修改代码后触发热重载时,不会重置组件已经存在的状态,此时之前的异步请求已经完成,
trackScreenData已经被赋值,所以再修改为访问下标就不会报错了。 - 控制台引用类型的延迟求值特性:你第一次打印
trackscreenData.data时,控制台输出的是引用类型的快照,你点击展开的时候才会读取属性的最新值,所以你会误以为首次打印时data已经有值,实际上打印的那一刻data还是undefined。
解决方案
- 给状态设置合理的初始值:初始化
trackScreenData时直接预设结构,比如const [trackScreenData, setTrackScreenData] = useState({ data: [] }),初始data为空数组时访问下标只会返回undefined不会报错。 - 访问深层属性时增加安全校验:可以用可选链语法简化校验,修改打印语句为
console.log(trackscreenData.data?.[0]),如果上层属性为undefined会直接返回undefined不会抛出错误。 - 增加条件判断后再访问:确认属性存在后再执行操作,比如
if (Array.isArray(trackscreenData.data)) { console.log(trackscreenData.data[0]) }。
内容的提问来源于stack exchange,提问作者Sander van Maastricht
相关产品推荐
相关产品推荐

