HarmonyOS 鸿蒙Next中根据官方arktslint错误代码修复后问题仍然存在
HarmonyOS 鸿蒙Next中根据官方arktslint错误代码修复后问题仍然存在 我用官方例子中的incorrect代码,执行full linter检测:[@performance/avoid-overusing-custom-component-check-性能规则@performance-Code Linter代码检查规则-代码检查-代码编辑-编写与调试应用 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-avoid-overusing-custom-component-check)
问题代码如下:
import { util } from '@kit.ArkTS';
interface User {
id: string;
name: string;
age?: number;
avatarImage?: ResourceStr;
// introduction: string;
// ...
}
// 构造数据
const DEFAULT_BACKGROUND_COLOR = Color.Pink;
const getUsers = () => {
const USERS: User[] = [{
id: '1',
name: '张三',
}, {
id: '2',
name: '李四',
}, {
id: '3',
name: '王五',
}];
return Array.from(Array(30), (item: User, i: number) => {
return {
id: util.generateRandomUUID(),
name: USERS[i%3].name,
avatarImage: $r('app.media.avatar'),
age: 18 + i
} as User;
});
}
// 用户卡片列表组件
@Component
export struct UserCardList {
@State users: User[] = getUsers();
build() {
List({ space: 8 }) {
ForEach(this.users, (item: User) => {
ListItem() {
UserCard({ name: item.name, age: item.age, avatarImage: item.avatarImage })
}
}, (item: User) => item.id)
}
.alignListItem(ListItemAlign.Center)
}
}
// 用户卡片自定义组件
@Component
struct UserCard {
@Prop avatarImage: ResourceStr;
@Prop name: string;
@Prop age: number;
build() {
Row() {
Row() {
Image(this.avatarImage)
.size({ width: 50, height: 50 })
.borderRadius(25)
.margin(8)
Text(this.name)
.fontSize(30)
}
Text(`年龄:${this.age.toString()}`)
.fontSize(20)
}
.backgroundColor(DEFAULT_BACKGROUND_COLOR)
.justifyContent(FlexAlign.SpaceBetween)
.borderRadius(8)
.padding(8)
.height(66)
.width('80%')
}
}
我根据我的理解修复后代码:
import { util } from '@kit.ArkTS';
interface User {
id: string;
name: string;
age?: number;
avatarImage?: ResourceStr;
// introduction: string;
// ...
}
// 构造数据
const DEFAULT_BACKGROUND_COLOR = Color.Pink;
const getUsers = () => {
const USERS: User[] = [{
id: '1',
name: '张三',
}, {
id: '2',
name: '李四',
}, {
id: '3',
name: '王五',
}];
return Array.from(Array(30), (item: User, i: number) => {
return {
id: util.generateRandomUUID(),
name: USERS[i%3].name,
avatarImage: $r('app.media.avatar'),
age: 18 + i
} as User;
});
}
// 用户卡片列表组件
@Component
export struct UserCardList {
@State users: User[] = getUsers();
// 使用 @Builder 替换 UserCard 自定义组件
@Builder
userCardBuilder(name: string, age: number, avatarImage: ResourceStr) {
Row() {
Row() {
Image(avatarImage)
.size({ width: 50, height: 50 })
.borderRadius(25)
.margin(8)
Text(name)
.fontSize(30)
}
Text(`年龄:${age.toString()}`)
.fontSize(20)
}
.backgroundColor(DEFAULT_BACKGROUND_COLOR)
.justifyContent(FlexAlign.SpaceBetween)
.borderRadius(8)
.padding(8)
.height(66)
.width('80%')
}
build() {
List({ space: 8 }) {
ForEach(this.users, (item: User) => {
ListItem() {
this.userCardBuilder(item.name, item.age, item.avatarImage)
}
}, (item: User) => item.id)
}
.alignListItem(ListItemAlign.Center)
}
}
// 原 UserCard 组件已删除,由 @Builder 函数替代
但还是会报错:

我要在UserCardList中添加如下方法才能消除此告警:
aboutToAppear(): void {
let message = 'hello world';
}
这样不合理吧,应该是修改了类型就能解决啊
更多关于HarmonyOS 鸿蒙Next中根据官方arktslint错误代码修复后问题仍然存在的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,若按arktslint错误代码修复后问题仍存在,可尝试以下步骤:
- 清理项目缓存,重新编译。
- 检查IDE版本与HarmonyOS SDK是否最新。
- 确认arktslint规则是否与当前API版本兼容。
- 查看官方文档或社区是否有已知问题。
更多关于HarmonyOS 鸿蒙Next中根据官方arktslint错误代码修复后问题仍然存在的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这个问题是因为 [@Builder](/user/Builder) 函数中使用了外部变量 DEFAULT_BACKGROUND_COLOR 导致的。@performance/avoid-overusing-custom-component-check 规则检测到 [@Builder](/user/Builder) 函数引用了组件外部的常量,这可能导致不必要的重建。
正确的修复方式是将 DEFAULT_BACKGROUND_COLOR 移动到 UserCardList 组件内部,或者作为参数传递给 [@Builder](/user/Builder) 函数。以下是修改方案:
方案一:将常量移到组件内部
@Component
export struct UserCardList {
private DEFAULT_BACKGROUND_COLOR: Color = Color.Pink;
// ... 其他代码保持不变
}
方案二:作为参数传递给 @Builder
[@Builder](/user/Builder)
userCardBuilder(name: string, age: number, avatarImage: ResourceStr, backgroundColor: Color) {
Row() {
// ... 原有内容
}
.backgroundColor(backgroundColor) // 使用参数
// ... 其他样式
}
// 调用时传递颜色
this.userCardBuilder(item.name, item.age, item.avatarImage, Color.Pink)
你添加 aboutToAppear() 方法能消除告警是因为改变了组件的结构,但这并不是正确的解决方案。按照上述任一方案修改即可正确解决该 lint 规则报错。

