onDpDataChange执行多次

小程序开发相关产品技术讨论,包括面板、智能小程序、React Native、Ray跨端框架、Panel SDK、微信小程序、小程序开发工具(IDE)及其他开发技术相关等话题


Post Reply
jie_73
Posts: 9

  • 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内的代码会执行多次
    • 预期结果:只显示一次弹窗提示
    • 实际结果:弹窗频繁触发

Tags:
xuanyi
Posts: 53
Location: 涂鸦玄一

Re: onDpDataChange执行多次

请问题具体的使用场景是怎样的。 另外代码具体是怎么写的,贴一下代码上下文吧。 访事件是根据设备上报次数来触发的。 如果希望监听一次就不再触发,需要自己去做判断。比如判断触发次数,或者在收到监听后关闭监听:
const handler = (res) =>{
showToast({ title: '保存成功!', icon: 'success' });
offDpDataChange(handler)
}

onDpDataChange(handler)

该写法在真机上应该是生效的, 在IDE上可能不会生效。

jie_73
Posts: 9

Re: onDpDataChange执行多次

场景.jpg

每次点击保存后进行弹窗提示

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' });
    }
  });
jie_73
Posts: 9

Re: onDpDataChange执行多次

数据打印.png
xuanyi
Posts: 53
Location: 涂鸦玄一

Re: onDpDataChange执行多次

上述写法设备每次上报都会触发,且设备重启后可能会上报全量数据,也有可能会走到弹出保存成功的情况。 建议尝试上一条回复中的方式,下发之前进行监听, 弹过窗后移除监听。 如果有其他全局监听的话可以保留。

如果你使用了 funciton 组件, 那上述 onDpDataChange 事件会注册多次。 也会导致多次触发该回调。建议使用 useEffect 包一下

Post Reply