uni-app Alpha3.3.0 view中 对一个数组计算length或者数组加上[0] 报错

uni-app Alpha3.3.0 view中 对一个数组计算length或者数组加上[0] 报错

操作步骤:

  • 运行到小程序 报错

预期结果:

  • 正常运行

实际结果:

  • 报错。

bug描述:

  • 升级3.3.0之后。 template中对数组计算长度时报错。例如 {{arr.length}}或者{{arr[0]}}

| 项目信息          | 值               |
|-------------------|------------------|
| 产品分类          | uniapp/小程序/微信 |
| PC开发环境操作系统 | Mac              |
| PC开发环境操作系统版本号 | mac 11.2.3       |
| HBuilderX类型     | Alpha            |
| HBuilderX版本号   | 3.3.0            |
| 第三方开发者工具版本号 | 1.05.2110290 | 1.06.2110290 |
| 基础库版本号      | vue3.0           |
| 项目创建方式      | HBuilderX        |

更多关于uni-app Alpha3.3.0 view中 对一个数组计算length或者数组加上[0] 报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

25 回复

之前的版本都没有问题,这个报错之后。 基本上判断数组为空的方式都不能用length判断了

更多关于uni-app Alpha3.3.0 view中 对一个数组计算length或者数组加上[0] 报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html


没有复现你说的问题,详细描述一下你的使用场景

TypeError: Cannot read property ‘length’ of undefined at Proxy._sfc_render (detail.js? [sm]:91) at renderComponentRoot (vue.runtime.esm.js?dc04:2699) at ReactiveEffect.componentUpdateFn [as fn] (vue.runtime.esm.js?dc04:2720) at ReactiveEffect.run (uni.api.esm.js?d5d0:433) at setupRenderEffect (vue.runtime.esm.js?dc04:2754) at mountComponent (vue.runtime.esm.js?dc04:2659) at createComponent3 (vue.runtime.esm.js?dc04:2797) at $createComponent (vue.runtime.esm.js?dc04:4907) at Ui.attached (uni.mp.esm.js?97ff:13) at i.safeCallback (VM4463 WAService.js:2)

请看我这一段:<view class="borderRadius u-p-t-30 u-p-b-40 u-p-l-30 u-p-r-30 bg_white u-m-t-30" v-if="info.receivers.length">

v-if=“info.receivers.length” 我加上这一段之后 最新版就会报 TypeError,在view元素内。 我用{{info.receivers[0]}}也会报错,回退版本就正常了

info.receivers这个字段是个数组。 我下面是循环这个数组,都是没有问题的

<view class="borderRadius u-p-t-30 u-p-b-40 u-p-l-30 u-p-r-30 bg_white u-m-t-30" v-if="info.receivers.length"> <view class="fdrow u-p-b-20 u-m-t-20"> <text class="font-28 cor_gray">接单人</text> </view> <view class="fdrow u-m-t-20"> <view class="avatar_lst list-column" v-for="(item,index) in info.receivers" :key="index"> <image :src="item.avatar" mode="aspectFill"></image> <text class="font-28 u-m-t-10 bold">{{item.realname}}</text> </view> </view> </view>

是运行到小程序,其他的没有试过

报错的源头就是这个:v-if=“info.receivers.length” 后期尝试。 直接将。 info.receivers.length放在模版里,例如:<view>{{info.receivers.length}}</view> 以及 <view>{{info.receivers[0]}}</view>都会报TypeError的错误, info.receivers确定是个数组。v-for是可以循环出来数据,升级版本之前都没问题,回退版本也是正常的

请提供完整的示例

我这边找到可以复现的方式了:定义个对象 如下: info:{ sub:[] }, 然后在模版中,{{info.sub.length}} 或者{{info.sub[0]}}

如果直接定一个数组。 sub:[] 这样是没有问题的,这个问题只在最新版出现,返回上一个版本是正常的

回复 DCloud_UNI_LXH: 我这边找到可以复现的方式了:定义个对象 如下:

然后在模版中,{{info.sub.length}} 或者{{info.sub[0]}}

回复 z***@126.com: 好的,我测试一下

回复 z***@126.com: 在 data 中定义 info:{ arr:[] } ,模板中访问 info.arr.length 和 info.arr[0]。编译到微信小程序,没有复现你说的问题

回复 DCloud_UNI_LXH: 明天我提供一下具体的代码吧,我试过好几次,我用的是vue3 的compositionApi

回复 DCloud_UNI_LXH: 这个问题要看控制器,会提示TypeError

回复 z***@126.com: 请提供完整的示例

回复 DCloud_UNI_LXH: 这个问题在我另外一台电脑上就是好的,暂时不知道怎么稳定复现,先这样吧,不过我提了另一个bug。也是新版本的,这个是可以复现的,要不帮我看看那个?

回复 z***@126.com: 可以尝试清楚微信开发者工具的缓存试试。令一个问题我会看的

在 uni-app Alpha 3.3.0 中,template 中对数组计算长度或访问数组元素时出现报错,这通常是由于 Vue 3 的响应式系统在处理数组时的特性变化导致的。

原因分析:

  1. Vue 3 响应式变化:Vue 3 使用 Proxy 实现响应式,与 Vue 2 的 defineProperty 不同。在 Vue 3 中,直接通过 {{arr.length}}{{arr[0]}} 访问数组时,如果数组是响应式对象,可能会触发 Proxy 的拦截行为,导致在某些情况下(特别是在小程序环境)出现兼容性问题。
  2. 小程序环境差异:小程序的自定义组件渲染机制与 Web 端不同,可能对 Vue 3 的响应式数组支持不够完善,导致模板解析出错。

解决方案:

  1. 使用计算属性:将数组长度或数组元素的访问封装到计算属性中,避免在模板中直接操作。

    computed: {
      arrLength() {
        return this.arr.length;
      },
      firstItem() {
        return this.arr[0];
      }
    }
    

    模板中改为:

    {{arrLength}} 或 {{firstItem}}
    
  2. 使用方法调用:在模板中调用方法获取数组信息。

    methods: {
      getArrLength() {
        return this.arr.length;
      }
    }
    

    模板中:

    {{getArrLength()}}
回到顶部