【发布时间】:2021-11-19 17:06:58
【问题描述】:
我有一个检测到的蓝牙设备列表,deviceList,它是用useState 设置的:
const [deviceList, setDeviceList] = useState([]);
我有一个启动设备扫描的按钮。每次扫描开始时,我都需要将设备列表重置为[]。我愿意:
const scanForDevices = () => {
setDeviceList([]);
manager.startDeviceScan(null, null, (error, device) => {
// add device to device list
setDeviceList(old => [...old, device]);
}
}
问题是setDeviceList 不是同步的,并且deviceList 在应该添加新设备时没有重置。这可能会导致重复的设备。我可以通过过滤来防止重复,但这只是对实际问题的一种破解。
我不能使用 useEffect 来解决这个问题,所以请不要建议它。 startDeviceScan 不能在每次deviceList 更改时运行。
在没有真正原子的setState 的情况下如何解决这种情况?
【问题讨论】:
-
在您提供的实现中,
manager.startDeviceScan似乎一次只添加一个设备。是这样吗? -
@fgkolf 没错
-
所以如果
setState像你所说的那样是原子的,那么你总是会得到一个包含一个设备的数组,因为old将是一个空数组。 -
那么正确的解决方案是什么?
-
忽略旧状态和
setDeviceList([device]);但我不确定这是您想要实现的目标。
标签: reactjs react-hooks