uni-app TypeError: Cannot destructure property 'firstElementChild' of 'rootRef.value' as it is null

发布于 1周前 作者 songsunli 来自 Uni-App

uni-app TypeError: Cannot destructure property ‘firstElementChild’ of ‘rootRef.value’ as it is null

操作步骤

vue3+setup onShow生命周期

  1. onShow生命周期获取订单列表接口返回的数据;
  2. 点击订单进入订单详情,然后再返回订单列表,onShow生命周期再次调用订单列表接口,浏览器控制台报错;

预期结果

onShow生命周期再次调用订单列表接口不报错,浏览器控制台不报错。

实际结果

vue3+setup onShow生命周期

  1. onShow生命周期获取订单列表接口返回的数据;
  2. 点击订单进入订单详情,然后再返回订单列表,onShow生命周期再次调用订单列表接口,浏览器控制台报错;

bug描述

vue3+setup onShow生命周期

  1. onShow生命周期获取订单列表接口返回的数据;
  2. 点击订单进入订单详情,然后再返回订单列表,onShow生命周期再次调用订单列表接口,浏览器控制台报错;

开发环境信息

项目创建方式 PC开发环境操作系统 PC开发环境操作系统版本号 HBuilderX类型 HBuilderX版本号 浏览器平台 浏览器版本
HBuilderX Windows Windows 11 正式 4.44 Chrome Chrome 已是最新版本 版本 131.0.6778.205(正式版本) (64 位)

图片1 图片2


3 回复

应该是你某个字段是null了,但是实际还使用了。vue3中加入了强类型。onLoad没问题是因为进来加载一次,当页面出栈后再跳转回来不会触发,只有页面被销毁后重新载入页面才会加载。


找到原因了,是因为loading加载状态引起的,页面v-if判断loading为true时候页面才显示,这样好像不行,去掉控制台就不报错了

在开发uni-app应用时,遇到 TypeError: Cannot destructure property 'firstElementChild' of 'rootRef.value' as it is null 这类错误通常意味着你尝试从一个未定义或尚未正确初始化的引用(ref)中解构出 firstElementChild 属性。这种情况常见于组件尚未挂载完成就尝试访问其DOM元素。

以下是一个简单的代码示例,展示了如何在uni-app中安全地处理这种情况,避免类似的错误。

示例代码

首先,确保你已经正确地在组件中使用了 ref 来引用DOM元素:

<template>
  <view ref="rootRef">
    <!-- 你的内容 -->
  </view>
</template>

<script>
export default {
  data() {
    return {
      // 其他数据
    };
  },
  mounted() {
    this.safeAccessFirstChild();
  },
  methods: {
    safeAccessFirstChild() {
      // 使用 this.$refs.rootRef 来访问引用的元素
      const rootRef = this.$refs.rootRef;
      
      // 检查 rootRef 是否存在以及它是否不是 null
      if (rootRef && rootRef.firstElementChild) {
        // 安全地解构或使用 firstElementChild
        const { firstElementChild } = rootRef;
        console.log(firstElementChild); // 你可以在这里对 firstElementChild 进行操作
      } else {
        console.error('rootRef is not available or firstElementChild is null');
      }
    }
  }
};
</script>

注意事项

  1. 生命周期钩子:确保你在正确的生命周期钩子中访问DOM元素。在uni-app中,mounted钩子是最合适的时机,因为此时组件的DOM已经被完全渲染。

  2. 条件渲染:如果你的DOM元素是通过条件渲染(如v-if)生成的,确保在访问这些元素之前,条件已经被满足。

  3. 错误处理:始终添加错误处理逻辑,以防止因未定义的引用而导致的程序崩溃。

  4. 使用nextTick:在某些情况下,你可能需要使用this.$nextTick()来确保DOM更新已经完成,特别是在数据变化后立即需要访问DOM时。

通过上述方法,你可以有效地避免在uni-app中因引用未定义或DOM元素尚未准备好而导致的错误。始终确保在访问任何可能未定义的属性之前进行必要的检查。

回到顶部