ArkTS的@ObjectLink 二维数组的示例 编译存在警告 HarmonyOS 鸿蒙Next
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>我也遇到了这个问题,建议
把
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😉
在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
组件来遍历和显示数组中的每个元素。
确保你的代码中:
- 数组类型定义正确。
@ObjectLink
的使用场景正确,虽然在这个示例中并未直接使用@ObjectLink
,因为通常@State
已经足够处理数据绑定。- 编译警告的具体内容,有时警告只是提醒,不一定影响功能。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html