HarmonyOS 鸿蒙Next 组件方法名导致的无限递归

HarmonyOS 鸿蒙Next 组件方法名导致的无限递归

触发问题的代码

// 自定义的Text组件
@Component
struct MyText {
  text: string
  build() {
    Text(this.text)
      .fontSize(30)
  }
}

// 自定义的子组件
@Component
struct Child {
  @State contents: string[] = []
  count = 1

  build() {
    Column() {
      // 点击按钮添加新的内容到contents中
      Button('Add to child')
        .fontSize(30)
        .onClick(this.addChild.bind(this))

      List() {
        ForEach(this.contents, (str: string) => {
          ListItem() {
            MyText({text: str})
            // Text(str)
          }
        }, (str) => str)
      }
    }
  }

  // 导致无限递归的元凶(指方法名)
  addChild() {
    this.contents.push('parent'+this.count.toString())
    this.count++
  }
}

// 入口组件
@Entry
@Component
struct Parent {
  build() {
    Column() {
      Child()
    }
  }
}

定睛一看没什么问题,打开previewer或者模拟器点击我们的按钮就会发现Child组件List在不断的添加新的MyText组件并且无限递归。

解决这个问题的3种方法

  1. 创建一个新的组件,将List放到新组件里并且将content传入
  2. 不使用自定义的组件而是使用ArkUi自带的Text组件
  3. 将方法名称addChild修改成任意别的名称都行

目前不知道这是BUG还是特性还是什么东西,我去网上也没有看到相关的内容,有人知道这是什么原因造成的吗?


更多关于HarmonyOS 鸿蒙Next 组件方法名导致的无限递归的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

ArkTS中this的语义仅限于传统的OOP风格,函数体中禁止使用this。不支持在函数中使用this。

替代方案:箭头函数

更多关于HarmonyOS 鸿蒙Next 组件方法名导致的无限递归的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我猜测的: 你创建的addchild和这个名字冲突了吧, 我之前使用list组件,创建了一个名字为ListItem的类,然后再list组件中使用listitem就会报错,感觉一个道理,不能用这些api来做为自定义命名

我有考虑过但多半不是这个原因,因为使用ArkUi自带的Text组件就不会触发这个问题,并且在兼容ArkTs中没有addChild,这个方法只有在兼容Js中有。

在HarmonyOS鸿蒙Next中,组件方法名导致的无限递归问题通常是由于在组件的生命周期方法或自定义方法中,错误地调用了自身,导致方法不断重复执行。例如,在onPageShowonPageHide等生命周期方法中,如果直接或间接地再次触发了该方法,就会形成无限递归。这种情况可能会导致应用崩溃或性能问题。解决方法是检查方法调用链,确保不会出现方法调用自身的逻辑错误。

回到顶部