uni-app鸿蒙元服务onLoad中nextTick内访问$refs会报错

uni-app鸿蒙元服务onLoad中nextTick内访问$refs会报错 产品分类:uniapp/小程序/鸿蒙元服务

PC开发环境操作系统 PC开发环境操作系统版本号 HBuilderX类型 HBuilderX版本号 第三方开发者工具版本号 基础库版本号 项目创建方式
Windows Windows 11 家庭中文版 23H2 Alpha 4.84 DevEco Studio 6.0.0 Release HBuilderX

示例代码:

<template>  
  <view class="content">  
    <u-sticky>  
      <image class="logo" src="/static/logo.png"></image>  
    </u-sticky>  
    <test ref="test" v-if="showTest"></test>  
    <button @click="show">  
      show  
    </button>  
    <button @click="close">  
      close  
    </button>  
  </view>  
</template>  

<script>  
import Test from "@/components/Test.vue";  

export default {  
  components: {Test},  
  data() {  
    return {  
      showTest: false  
    }  
  },  
  onLoad() {  
    this.show()  
  },  
  methods: {  
    show() {  
      this.showTest = true;  
      this.$nextTick(() => {  
        setTimeout(() => {  
          this.$refs.test.alert()  
        }, 200)  
      })  
    },  
    close() {  
      this.showTest = false;  
    }  
  }  
}  
</script>

更多关于uni-app鸿蒙元服务onLoad中nextTick内访问$refs会报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

目前解决方案: main.js: // #ifdef MP-HARMONY
// 在 new Vue() 之前重写 $nextTick
const originalNextTick = Vue.prototype.$nextTick
Vue.prototype.$nextTick = function (callback) {
setTimeout(() => {
if (typeof callback === ‘function’) {
// 可选择是否使用原始实现
return originalNextTick.call(this, callback)
} else {
// 支持无回调的 Promise 用法:this.$nextTick().then(…)
return originalNextTick.call(this)
}
}, 300)
}
// #endif
const app = new Vue({
…App,
});

app.$mount(); 写100毫秒还是报错,写300又会有明细的卡顿,用户体验不好。但不写高一点又怕部分性能不好的设备需要这么高的等待时间

更多关于uni-app鸿蒙元服务onLoad中nextTick内访问$refs会报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


更好一点的临时解决方案:

回复 2***@qq.com: 实际测试发现此方法并非对每一个页面都有效,而据ai所说,prod发布会将created,created等函数名修改为过短的名称。所以此方法在生产环境无效,要发布也只能dev发布

onload 太早了,这个时候 ui 还没开始渲染,等到 onready 或者 onmounted 里操作

试了,onReady也不行

onReady测试,一样不行

在鸿蒙元服务环境中,onLoad 生命周期内使用 nextTick 访问 $refs 报错是常见问题,主要原因是组件渲染时机与鸿蒙平台的差异。

问题分析:

  1. onLoad 触发时,组件可能尚未完成初始渲染
  2. 即使使用 nextTick,在鸿蒙环境下组件实际挂载可能仍存在延迟
  3. v-if 控制的组件在首次渲染时需要额外时间

解决方案:

  1. 增加渲染延迟保障
show() {
  this.showTest = true;
  this.$nextTick(() => {
    // 鸿蒙环境下需要更长的延迟
    setTimeout(() => {
      if(this.$refs.test) {
        this.$refs.test.alert();
      }
    }, 300) // 适当延长延迟时间
  })
}
  1. 使用条件判断保护
this.$nextTick(() => {
  setTimeout(() => {
    if(this.$refs.test && typeof this.$refs.test.alert === 'function') {
      this.$refs.test.alert();
    }
  }, 200)
})
  1. 替代方案:使用 onReady 生命周期
onReady() {
  // 在onReady中确保组件已完全渲染
  this.show();
}
回到顶部