uni-app vue3 京东小程序 通过鸿蒙next打开有兼容bug

uni-app vue3 京东小程序 通过鸿蒙next打开有兼容bug

开发环境 版本号 项目创建方式
Windows win11 HBuilderX

操作步骤:

见附件

预期结果:

computed和watch正常使用

实际结果:

computed和watch失效

bug描述:

vue3 京东小程序 通过鸿蒙next打开 子组件computed和watch失效 具体见附件demo

17 回复

鸿蒙上京东小程序不触发数据更新监听。调试后发现,如果配置了 pureDataPattern(纯数据字段),则 ComponentOptions.properties.propertyName.observer 就不会触发,而除鸿蒙外的平台会触发。
我在京东小程序的官网并没有找到相关的文档,而在微信小程序的文档上找到了 pureDataPattern 的说明,根据这里的说明,看起来鸿蒙上的表现是对的,微信小程序文档:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/pure-data.html
而如果改用 ComponentOptions.observers.propertyName 来做纯数据字段的变化监听,又在除鸿蒙平台之外的平台不触发变化了
估计是京东小程序的 Bug,各平台表现不一致。
临时解决方案 先在 HBuilderX 根目录/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-mp-jd/dist/uni.mp.esm.js  搜索 pureDataPattern 注释掉重新编译运行

更多关于uni-app vue3 京东小程序 通过鸿蒙next打开有兼容bug的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


您好,我现在按照您说的这个方式,修改了之后还是不行,这个想问下是否还有地方需求修改

当前是mac环境,对应的文件位置是/Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-mp-jd/dist/uni.mp.esm.js

有官方人员回答一下吗

有官方人员回答一下吗

其他手机打开没问题?

是的 真机 模拟器都没问题 生产跑很久了 现在要兼容鸿蒙 就发现这些问题

当前我也是这个问题,我单纯的setTimeout模拟请求,更新了父组件的字段,打印只有父组件有,子组件里面除了第一次接收到props,后面连watch都没触发

回复 t***@163.com: 大佬,你是不是props也一直拿不到更新的值

回复 1***@qq.com: 嗯 就是我描述的子组件computed和watch失效

回复 t***@163.com: 我当前也是,我就传参,setTimeout去简单修改,子组件怎么都拿不到新的值

回复 1***@qq.com: 看下官方回复哈

回复 t***@163.com: 好的,我试试,谢谢大佬

回复 t***@163.com: 您这边试了之后可以吗,我的好像还是不行,props还是报错

在 uni-app 中使用 Vue3 开发京东小程序时,通过鸿蒙 Next 打开出现 computed 和 watch 失效的问题,通常与鸿蒙 Next 对 Vue3 响应式系统的兼容性有关。以下是可能的原因和解决方案:

  1. 响应式系统兼容性:鸿蒙 Next 可能未完全适配 Vue3 的 Proxy-based 响应式机制。尝试在 vue.config.js 中配置 compositionApifalse,回退到 Options API 测试是否正常。

  2. 生命周期差异:检查子组件的生命周期钩子是否在鸿蒙 Next 中正常触发。若 onMountedonUpdated 未执行,可能导致 computed 和 watch 未初始化。

  3. 编译配置:在 manifest.json 中确认京东小程序的编译配置是否正确,特别是 "mp-jd" 相关设置。尝试更新 HBuilderX 到最新版本,确保编译链支持鸿蒙 Next。

  4. 依赖注入问题:若子组件依赖父组件的 provide/inject,需验证鸿蒙 Next 是否支持该特性。可改用 props 传递数据测试。

  5. 临时解决方案:将 computed 替换为 ref 结合 watchEffect,或使用 watch 的 immediate 选项强制初始化。例如:

    const value = ref(0);
    watchEffect(() => {
      console.log(value.value);
    });
回到顶部