前端梦工厂
前端梦工厂
  • 发布:2026-02-05 11:20
  • 更新:2026-02-06 11:10
  • 阅读:29

【报Bug】鸿蒙APP场景下uni.upx2px方法得到的值与其他平台不同

分类:鸿蒙Next

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: windows11

手机系统: HarmonyOS NEXT

手机系统版本号: HarmonyOS 6.0.0

手机厂商: 华为

手机机型: Huawei Mate 70 Pro+

页面类型: vue

vue版本: vue3

打包方式: 离线

项目创建方式: CLI

CLI版本号: 4.87

示例代码:
console.log('upx2px 100', uni.upx2px(100));  
console.log('rpx2px 100', uni.rpx2px(100));

操作步骤:
  1. "rpxCalcBaseDeviceWidth": 750 时:
    // 鸿蒙App下

    console.log('upx2px 100', uni.upx2px(100)); // 输出100  
    console.log('rpx2px 100', uni.rpx2px(100)); // 输出50

    // h5 下

    console.log('upx2px 100', uni.upx2px(100)); // 输出55  
    console.log('rpx2px 100', uni.rpx2px(100)); // 输出55

    以上情况在鸿蒙APP下不一致

  2. 当"rpxCalcBaseDeviceWidth": 375时:

    console.log('upx2px 100', uni.upx2px(100)); // 输出50  
    console.log('rpx2px 100', uni.rpx2px(100)); // 输出50

    // h5 下

    console.log('upx2px 100', uni.upx2px(100)); // 输出55  
    console.log('rpx2px 100', uni.rpx2px(100)); // 输出55

    以上情况一致

预期结果:
  1. "rpxCalcBaseDeviceWidth"为750 时,uni.upx2px()获取的值应与其他平台表现应一致,与uni.rpx2px也应一致
  2. "rpxCalcBaseDeviceWidth"为375时,鸿蒙App平台下获取的值应与其他平台表现一致,与uni.rpx2px一致

实际结果:
  1. "rpxCalcBaseDeviceWidth"为750 时,uni.upx2px()获取的值应与其他平台表现不一致,与uni.rpx2px也不一致
  2. "rpxCalcBaseDeviceWidth"为375时,鸿蒙App平台下获取的值应与其他平台表现一致,与uni.rpx2px一致

bug描述:

使用uni-app开发鸿蒙应用时:

当设置 "rpxCalcBaseDeviceWidth": 750 时:uni.upx2px方法与uni.rpx2px得到的值不同

当设置 "rpxCalcBaseDeviceWidth": 375 时:uni.upx2px方法与uni.rpx2px得到的值又是相同的

导致有个问题,我开发的组件库都是默认设置,也就是"rpxCalcBaseDeviceWidth": 375,内部使用的是uni.upx2px方法。组件库开源后,用户使用时的配置"rpxCalcBaseDeviceWidth": 750,导致组件库内uni.upx2px转化的值不符合预期,组件库内部样式错乱。

2026-02-05 11:20 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( uni-app鸿蒙化技术交流群 ) 咨询,群中有相关专业的管理员和群友。

【官方评审结论】
该反馈描述清晰、复现步骤完整,已确认为鸿蒙平台 uni.upx2px 与 uni.rpx2px 在 rpxCalcBaseDeviceWidth ≠ 375 时的计算差异缺陷,属于有效 BUG。


1. 反馈完整性评估

检查项 状态 说明
BUG 描述 明确给出配置差异及影响范围
代码示例 可直接运行
复现步骤 分平台、分配置对比,逻辑清晰
预期/实际结果 差异量化,易于验证
环境信息 版本、机型、系统均完整

无需补充信息,可直接进入复现流程。


2. 依据知识库判定 BUG 成立

  • 优先知识库已指出:

    rpxCalcBaseDeviceWidth 等三个属性仅支持 App(vue2 且不含 nvue)、H5(2.8.12+)
    link

    鸿蒙 Next 平台 在 4.33-alpha 起已新增 uni.upx2px 支持:

    App-HarmonyOS平台 新增 支持 uni.upx2px release-note-alpha

    因此:

    1. 鸿蒙端确实实现了 uni.upx2px,但实现逻辑未与 uni.rpx2px 保持一致;
    2. rpxCalcBaseDeviceWidth 为 750 时,upx2px(100) 返回 100(未按 750→375 缩放),而 rpx2px(100) 返回 50(正确缩放),两者应相等;
    3. 当基准设为 375 时,两 API 返回值一致,说明差异仅出现在 非默认基准 场景。

综上,BUG 成立,属鸿蒙端特有实现缺陷。


3. 临时规避建议(官方可同步告知用户)

在官方修复前,组件库作者可在初始化时动态校准:

// 鸿蒙且 rpxCalcBaseDeviceWidth=750 时手动修正  
function safeUpx2px(val) {  
  // #ifdef APP-HARMONY  
  if (uni.getSystemInfoSync().platform === 'harmony') {  
    const { windowWidth } = uni.getSystemInfoSync();  
    // 按 750 基准重新计算  
    return Math.round(val * windowWidth / 750);  
  }  
  // #endif  
  return uni.upx2px(val);  
}

4. 后续官方处理

  • 缺陷等级:P2(影响组件库跨端一致性)
  • 修复计划:下版本对齐 uni.upx2pxuni.rpx2px 在鸿蒙端的计算逻辑,确保无论 rpxCalcBaseDeviceWidth 取何值,两 API 返回值一致。
内容为 AI 生成,仅供参考
DCloud_UNI_yuhe

DCloud_UNI_yuhe

我这运行发现没有差异,你升级 alpha 5.0 测试一下,如果还不行,发一个测试项目看看

要回复问题请先登录注册