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

React Native使用expo-sensors采集加速度计数据时数组无法追加新值

问题根因

这是React Hooks的陈旧闭包问题,和Expo传感器库本身的逻辑无关:

  • 你把传感器监听逻辑写在依赖为空的useEffect中,该逻辑仅在组件首次挂载时执行1次,监听器回调里捕获的data变量,永远是组件初始化时的状态值——也就是长度为1、仅包含初始{x:0,y:0,z:0}的数组。
  • 每次传感器触发回调执行setData([...data, accData])时,展开的永远是这个初始长度为1的旧数组,所以最终生成的新数组永远只有「初始值+最新一次测量值」两个元素,不会持续累加。
  • 回调内console.log(data)打印的也是闭包捕获的旧值,自然看不到持续增长的数组。
修复方法

把setData的写法改成函数式更新,这种写法可以直接拿到上一次状态更新后的最新值,不需要依赖闭包捕获的旧data变量:

Accelerometer.addListener(accData => {
  // 入参prevData是React保证的、上一次更新后的最新状态
  setData(prevData => [...prevData, accData])
})

修改后不需要调整useEffect的依赖数组,也不会出现重复绑定监听器的问题,历史测量值会正常追加到列表中。

如果后续要实现5秒自动停止采集的逻辑,直接在useEffect里加个定时器,时间到了移除监听器即可,采集完成后遍历data数组就能算出三个轴的均值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:09:20