LocalBuilder装饰器

【中工开发者】根据HarmonyOS官方文档

定义语法

@LocalBuilder
MyBuilderFunction() { ... }

使用方法

this.MyBuilderFunction()

特点

允许在自定义组件内定义一个或多个 @LocalBuilder 方法。
该方法被认为是组件的私有、特殊类型的成员函数。
自定义构建函数可以在所属组件的 build 方法和其他自定义构建函数中调用,但不允许在组件外调用。
在自定义函数体中,this 指代当前所属组件,组件的状态变量可以在自定义构建函数内访问。
限制条件
@LocalBuilder 只能在所属组件内声明,不允许全局声明。
@LocalBuilder 不能被内置装饰器和自定义装饰器使用。
自定义组件内的静态方法不能和 @LocalBuilder 一起使用。

参数传递规则

按值传递

调用 @LocalBuilder 装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起 @LocalBuilder 方法内的 UI 刷新。


按引用传递

只有传入一个参数,且参数需要直接传入对象字面量才会按引用传递该参数,其余传递方式均为按值传递。按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起 @LocalBuilder 方法内的 UI 刷新。

使用场景

场景一:组件内状态变量的按引用传递

class ReferenceType {
  paramString: string = '';
}

@Entry
@Component
struct Parent {
  @State variableValue: string = 'Hello World';

  @LocalBuilder
  citeLocalBuilder(params: ReferenceType) {
    Row() {
      Text(`UseStateVarByReference: ${params.paramString} `)
    }
  };

  build() {
    Column() {
      this.citeLocalBuilder({ paramString: this.variableValue });
      Button('Click me').onClick(() => {
        this.variableValue = 'Hi World';
      })
    }
  }
}

当点击按钮时,variableValue 的值从 'Hello World' 变为 'Hi World',citeLocalBuilder 方法内的 Text 组件会随之更新。

场景二:子组件调用父组件的 @LocalBuilder 函数

class ReferenceType {
  paramString: string = '';
}

@Component
struct HelloComponent {
  @Prop message: string;

  build() {
    Row() {
      Text(`HelloComponent===${this.message}`);
    }
  }
}

@Entry
@Component
struct Parent {
  @State variableValue: string = 'Hello World';

  @LocalBuilder
  citeLocalBuilder($$: ReferenceType) {
    Row() {
      Column() {
        Text(`citeLocalBuilder===${$$.paramString}`);
        HelloComponent({ message: $$.paramString });
      }
    }
  }

  build() {
    Column() {
      this.citeLocalBuilder({ paramString: this.variableValue });
      Button('Click me').onClick(() => {
        this.variableValue = 'Hi World';
      })
    }
  }
}

当 variableValue 的值发生变化时,citeLocalBuilder 方法内的 Text 组件和 HelloComponent 组件都会随之更新。

场景三:子组件引用父组件的 @LocalBuilder 函数

class LayoutSize {
  size: number = 0;
}

@Entry
@Component
struct Parent {
  label: string = 'parent';
  @State layoutSize: LayoutSize = { size: 0 };

  @LocalBuilder
  // @Builder
  componentBuilder($$: LayoutSize) {
    Text(`${'this :'+this.label}`);
    Text(`${'size :'+$$.size}`);
  }

  build() {
    Column() {
      Child({ contentBuilder: this.componentBuilder });
    }
  }
}

@Component
struct Child {
  label: string = 'child';
  @BuilderParam contentBuilder: ((layoutSize: LayoutSize) => void);
  @State layoutSize: LayoutSize = { size: 0 };

  build() {
    Column() {
      this.contentBuilder({ size: this.layoutSize.size });
      Button("add child size").onClick(() => {
        this.layoutSize.size += 1;
      })
    }
  }
}

子组件 Child 调用父组件 Parent 的 @LocalBuilder 方法 componentBuilder。由于 @LocalBuilder 绑定在父组件上,状态变量的变化不会引发 componentBuilder 方法内的 UI 刷新。

场景四:按值传递参数

@Entry
@Component
struct Parent {
  @State label: string = 'Hello';

  @LocalBuilder
  citeLocalBuilder(paramA1: string) {
    Row() {
      Text(`UseStateVarByValue: ${paramA1} `)
    }
  }

  build() {
    Column() {
      this.citeLocalBuilder(this.label);
    }
  }
}

citeLocalBuilder 方法获取到的是普通变量值,因此改变 @State 修饰的 label 值时,citeLocalBuilder 方法内的值不会发生改变。

总结

@LocalBuilder 是一个强大的装饰器,允许在自定义组件内定义私有的构建函数。它支持按值传递和按引用传递参数,但在使用时需要注意 this 的指向和状态变量的刷新机制。通过合理使用 @LocalBuilder,可以提高组件的复用性和可维护性。

### LocalBuilder 使用方法及示例 #### 定义与作用 `@LocalBuilder` 装饰器用于特定环境下的构建逻辑封装,通常应用于需要局部化处理的场景中。此装饰器能够增强代码模块性和可维护性,特别是在复杂的应用程序结构下[^3]。 #### 基本语法 当应用 `@LocalBuilder` 时,目标通常是定义一个具有特殊行为的对象或函数。该装饰器允许开发者指定一些初始化参数以及配置选项来定制其工作方式: ```typescript function LocalBuilder(options?: any): ClassDecorator { return function (target: Function) { // 实现细节... }; } ``` #### 应用实例 下面是一个简单的例子,展示了如何在一个自定义组件内使用 `@LocalBuilder` 来创建带有观察者模式支持的功能组件。通过这种方式可以在不改变原有业务逻辑的基础上轻松集成响应式特性。 ```typescript import { Component, Observed } from 'some-framework'; // 自定义组件类前加上 @LocalBuilder 装饰器 @LocalBuilder({ /* 配置项 */ }) @ComponentV2({ selector: 'my-component', }) class MyComponent { private data: string; constructor() { this.data = "Initial Data"; } // 利用 @Observed 和 @Trace 进行 UI 更新控制 @Observed() public updateData(newValue: string) { console.log(`Updating data to ${newValue}`); this.data = newValue; } } const componentInstance = new MyComponent(); componentInstance.updateData('New Value'); // 此操作会触发 UI 的自动更新机制 ``` 在这个案例中,每当调用了 `updateData()` 方法之后,由于有 `@Observed` 和 `@Trace` 的存在,框架将会检测到数据的变化并相应地刷新视图界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值