文档管理中心

@performance/hp-arkui-no-func-as-arg-for-reusable-component

避免使用函数作为复用的自定义组件创建时的入参。

滑动丢帧场景下,建议优先修改。

规则配置

收起
自动换行
深色代码主题
复制
  1. // code-linter.json5
  2. {
  3. "rules": {
  4. "@performance/hp-arkui-no-func-as-arg-for-reusable-component": "warn",
  5. }
  6. }

选项

该规则无需配置额外选项。

正例

收起
自动换行
深色代码主题
复制
  1. // 源码文件,请以工程实际为准
  2. import { MyDataSource } from './MyDataSource';
  3. @Reusable
  4. @Component
  5. struct ChildComponent {
  6. @State desc: string = '';
  7. @State sum: number = 0;
  8. aboutToReuse(params: Record<string, Object>): void {
  9. this.desc = params.desc as string;
  10. this.sum = params.sum as number;
  11. }
  12. build() {
  13. Column() {
  14. Text('子组件' + this.desc)
  15. .fontSize(30)
  16. .fontWeight(30)
  17. Text('结果' + this.sum)
  18. .fontSize(30)
  19. .fontWeight(30)
  20. }
  21. }
  22. }
  23. @Entry
  24. @Component
  25. struct MyComponent{
  26. private data: MyDataSource = new MyDataSource();
  27. @State sum: number = 0;
  28. aboutToAppear(): void {
  29. for (let index = 0; index < 20; index++) {
  30. this.data.pushData(index.toString())
  31. }
  32. // 执行该异步函数
  33. this.count();
  34. }
  35. // 模拟耗时操作逻辑
  36. async count() {
  37. let temp: number = 0;
  38. for (let index = 0; index < 10000; index++) {
  39. temp += index;
  40. }
  41. // 将结果放入状态变量中
  42. this.sum = temp;
  43. }
  44. build() {
  45. Column() {
  46. List() {
  47. LazyForEach(this.data, (item: string) => {
  48. ListItem() {
  49. // 子组件的传参通过状态变量进行
  50. ChildComponent({ desc: item, sum: this.sum })
  51. }
  52. .width('100%')
  53. .height(100)
  54. }, (item: string) => item)
  55. }
  56. .width('100%')
  57. .height('100%')
  58. }
  59. }
  60. }

反例

收起
自动换行
深色代码主题
复制
  1. // 源码文件,请以工程实际为准
  2. import { MyDataSource } from './MyDataSource';
  3. // 此处为复用的自定义组件
  4. @Reusable
  5. @Component
  6. struct ChildComponent {
  7. @State desc: string = '';
  8. @State sum: number = 0;
  9. aboutToReuse(params: Record<string, Object>): void {
  10. this.desc = params.desc as string;
  11. this.sum = params.sum as number;
  12. }
  13. build() {
  14. Column() {
  15. Text('子组件' + this.desc)
  16. .fontSize(30)
  17. .fontWeight(30)
  18. Text('结果' + this.sum)
  19. .fontSize(30)
  20. .fontWeight(30)
  21. }
  22. }
  23. }
  24. @Entry
  25. @Component
  26. struct MyComponent{
  27. private data: MyDataSource = new MyDataSource();
  28. aboutToAppear(): void {
  29. for (let index = 0; index < 20; index++) {
  30. this.data.pushData(index.toString())
  31. }
  32. }
  33. // 真实场景的函数中可能存在未知的耗时操作逻辑,此处用循环函数模拟耗时操作
  34. count(): number {
  35. let temp: number = 0;
  36. for (let index = 0; index < 10000; index++) {
  37. temp += index;
  38. }
  39. return temp;
  40. }
  41. build() {
  42. Column() {
  43. List() {
  44. LazyForEach(this.data, (item: string) => {
  45. ListItem() {
  46. // 此处sum参数是函数获取的,实际开发场景无法预料该函数可能出现的耗时操作,每次进行组件复用都会重复触发此函数的调用
  47. ChildComponent({ desc: item, sum: this.count() })
  48. }
  49. .width('100%')
  50. .height(100)
  51. }, (item: string) => item)
  52. }
  53. .height('100%')
  54. .width('100%')
  55. }
  56. }
  57. }

规则集

收起
自动换行
深色代码主题
复制
  1. plugin:@performance/recommended
  2. plugin:@performance/all

Code Linter代码检查规则的配置指导请参考Code Linter代码检查

在 指南 中进行搜索
请输入您想要搜索的关键词