- Tuya MiniApp Tools 版本信息:0.7.0
- App 应用版本信息: 5.16.1
- @ray-js/ray, @ray-js/panel-sdk的版本 "@ray-js/ray": "1.4.45","@ray-js/panel-sdk": "1.10.0",
- 移动设备信息:安卓(Redmi K60 Ultra) 系统:HyperOS
- 相关代码:
Code: Select all
onDpDataChange(res => { console.log('res :>> ', res); showToast({ title: '保存成功!', icon: 'success' }); });
- 问题描述(复现步骤):onDpDataChange内的代码会执行多次
- 预期结果:只显示一次弹窗提示
- 实际结果:弹窗频繁触发
onDpDataChange执行多次
onDpDataChange执行多次
Tags:
Re: onDpDataChange执行多次
请问题具体的使用场景是怎样的。 另外代码具体是怎么写的,贴一下代码上下文吧。 访事件是根据设备上报次数来触发的。 如果希望监听一次就不再触发,需要自己去做判断。比如判断触发次数,或者在收到监听后关闭监听:
const handler = (res) =>{
showToast({ title: '保存成功!', icon: 'success' });
offDpDataChange(handler)
}
onDpDataChange(handler)
该写法在真机上应该是生效的, 在IDE上可能不会生效。
Re: onDpDataChange执行多次
每次点击保存后进行弹窗提示
Code: Select all
/**
* @description: 保存
*/
const handleSave = () => {
// 经纬度校验正则(数字,最多六位小数)
const checkReg = /^-?\d+(\.\d{1,6})?$/;
// 非空校验
if (
!isNotEmpty(angleValue)
) {
showToast({
title: Strings.getLang('save_not_empty_check') || '请完成内容填写后再提交!',
icon: 'none',
});
return;
}
// 经纬度校验
if (!checkReg.test(longitudeValue) || !checkReg.test(latitudeValue)) {
showToast({
title: Strings.getLang('save_value_check') || '请输入正确的经纬度,最多保留六位小数!',
icon: 'none',
});
return;
}
// 将经纬度转为字符串
const longitudeStringValue = longitudeValue.toString();
const latitudeStringValue = latitudeValue.toString();
// 下发功能点
publishDps({
[LONGITUDE.code]: longitudeStringValue,
[LATITUDE.code]: latitudeStringValue,
[ANGLE.code]: angleValue,
});
};
/**
* @description: 接收数据上报
*/
onDpDataChange(res => {
console.log('res :>> ', res);
const dps = res.dps;
if (
isNotEmpty(dps[LONGITUDE.id]) &&
isNotEmpty(dps[LATITUDE.id]) &&
isNotEmpty(dps[ANGLE.id])
) {
showToast({ title: '保存成功!', icon: 'success' });
}
});
Re: onDpDataChange执行多次
上述写法设备每次上报都会触发,且设备重启后可能会上报全量数据,也有可能会走到弹出保存成功的情况。 建议尝试上一条回复中的方式,下发之前进行监听, 弹过窗后移除监听。 如果有其他全局监听的话可以保留。
如果你使用了 funciton 组件, 那上述 onDpDataChange 事件会注册多次。 也会导致多次触发该回调。建议使用 useEffect 包一下
Re: onDpDataChange执行多次
你好,该问题已超过七天未更新,为整体保障问题跟进效率,我们临时将此标记为已关闭,如有需要请回复并联系我们继续跟进。