ArkTS的@ObjectLink 二维数组的示例 编译存在警告 HarmonyOS 鸿蒙Next

发布于 1周前 作者 caililin 来自 鸿蒙OS

ArkTS的@ObjectLink 二维数组的示例 编译存在警告 HarmonyOS 鸿蒙Next
<markdown _ngcontent-ihe-c149="" class="markdownPreContainer">

在文档@Observed装饰器和@ObjectLink装饰器中二维数组的示例在编译过程中存在警告。 源码:

[@Observed](/user/Observed)
class StringArray extends Array<String> {
}
[@Component](/user/Component)
struct ItemPage {
  [@ObjectLink](/user/ObjectLink) itemArr: StringArray;

  build() {
    Row() {
      Text('ItemPage')
        .width(100).height(100)

      ForEach(this.itemArr,
        item => {
          Text(item)
            .width(100).height(100)
        },
        item => item
      )
    }
  }
}
[@Entry](/user/Entry)
[@Component](/user/Component)
struct IndexPage {
  [@State](/user/State) arr: Array<StringArray> = [new StringArray(), new StringArray(), new StringArray()];
  build() {
    Column() {
      ItemPage({ itemArr: this.arr[0] })
      ItemPage({ itemArr: this.arr[1] })
      ItemPage({ itemArr: this.arr[2] })
      Divider()
      ForEach(this.arr,
        itemArr => {
          ItemPage({ itemArr: itemArr })
        },
        itemArr => itemArr[0]
      )
      Divider()
      Button('update')
        .onClick(() => {
          console.error('Update all items in arr');
          if (this.arr[0][0] !== undefined) {
            // 正常情况下需要有一个真实的ID来与ForEach一起使用,但此处没有
            // 因此需要确保推送的字符串是唯一的。
            this.arr[0].push(`${this.arr[0].slice(-1).pop()}${this.arr[0].slice(-1).pop()}`);
            this.arr[1].push(`${this.arr[1].slice(-1).pop()}${this.arr[1].slice(-1).pop()}`);
            this.arr[2].push(`${this.arr[2].slice(-1).pop()}${this.arr[2].slice(-1).pop()}`);
          } else {
            this.arr[0].push('Hello');
            this.arr[1].push('World');
            this.arr[2].push('!');
          }
        })
    }
  }
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

编译日志:

> hvigor Finished ::PreBuildApp... after 1 ms 
> hvigor UP-TO-DATE :entry:default[@PreBuild](/user/PreBuild)...  
> hvigor UP-TO-DATE :entry:default[@GenerateMetadata](/user/GenerateMetadata)...  
> hvigor UP-TO-DATE :entry:default[@MergeProfile](/user/MergeProfile)...  
> hvigor Finished :entry:default@BuildNativeWithCmake... after 1 ms 
> hvigor UP-TO-DATE :entry:default[@GenerateLoaderJson](/user/GenerateLoaderJson)...  
> hvigor UP-TO-DATE :entry:default[@MakePackInfo](/user/MakePackInfo)...  
> hvigor UP-TO-DATE :entry:default[@ProcessProfile](/user/ProcessProfile)...  
> hvigor Finished :entry:default@BuildNativeWithNinja... after 1 ms 
> hvigor UP-TO-DATE :entry:default[@ProcessResource](/user/ProcessResource)...  
> hvigor UP-TO-DATE :entry:default[@ProcessLibs](/user/ProcessLibs)...  
> hvigor UP-TO-DATE :entry:default[@CompileResource](/user/CompileResource)...  
> hvigor Finished :entry:default@CompileJS... after 4 ms 
> hvigor WARN: ArkTS:WARN File: I:/CardTest/entry/src/main/ets/pages/Second.ets:40:31
 The regular property 'itemArr' cannot be assigned to the [@ObjectLink](/user/ObjectLink) property 'itemArr'.
 ......
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

这个警告算是误报吗?

虽然运行起来看着没问题,但是这个警告看着很不舒服,而且因为现在对于ArkTS的这个更新机制的原理不是很了解,所以有点担心。

</markdown>
7 回复

我也遇到了这个问题,建议

ForEach(this.arr,

        itemArr => {

          ItemPage({ itemArr: itemArr })

        },

        itemArr => itemArr[0]

      )

改写成:

ForEach(this.arr,

        (itemArr, idx) => {

          ItemPage({ itemArr: this.arr[idx] })

        },

        itemArr => itemArr[0]

      )

就没有警告信息了。其实都一样,不影响运行。

这样改确实没有警告了,好神奇

这样不行,正常渲染,但是如果修改了数据,页面没有同步渲染

不影响运行的bug都不是bug😉

我想问一下 为什么 foreach 循环出来的是一项而不是三项呢?
我也遇到了😂  有官方的回复吗

在ArkTS中,如果你在使用@ObjectLink处理二维数组时遇到编译警告,通常可能是因为类型定义或者数据绑定的问题。以下是一个简单的示例,展示如何定义和使用二维数组与@ObjectLink,你可以参考这个示例来检查你的代码。

import { @ObjectLink } from '@arkui-js/arkui';

@Entry
@Component
struct MyComponent {
  @State array: number[][] = [[1, 2], [3, 4]];

  build() {
    Column() {
      ForEach(this.array, (row, rowIndex) => {
        Row() {
          ForEach(row, (value, colIndex) => {
            Text(`${value}`)
              .fontSize(20)
          })
        }
      })
    }
  }
}

在这个示例中,我们定义了一个二维数组array,并使用ForEach组件来遍历和显示数组中的每个元素。

确保你的代码中:

  1. 数组类型定义正确。
  2. @ObjectLink的使用场景正确,虽然在这个示例中并未直接使用@ObjectLink,因为通常@State已经足够处理数据绑定。
  3. 编译警告的具体内容,有时警告只是提醒,不一定影响功能。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部