OpenHarmony开发者论坛
标题:
装饰器使用心得
[打印本页]
作者:
深开鸿_覃贞庆
时间:
2024-11-16 23:12
标题:
装饰器使用心得
[md]# @Builder装饰器
为了防止大量重复的代码,我们可以将相同的UI结构封装在@Builder装饰器里,完成UI结构的复用。
@Builder装饰器传值分为值传递和引用传递,值传递状态变量的改变不会引起@Builder方法内的UI刷新,引用传递则可以引起@Builder方法内的UI刷新
```
/*想要实时通过@build修改内容,我们采用$$来将传入参数变为引用传递的方式,使其可以在点击后正确的修改内容
同时在5.0ide里我们必须自定义一个class或者interface将数据封装否则会报错如下
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
@Builder
do($$: {param: string }) { //会报错Object literals cannot be used as type declarations
Text($$.param)
}
build(){
Column(){
this.do({param:this.message})
Button().onClick(()=>{
this.message="change"
})
}
}
}
*/
class a{
msg:string="123"
}
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
@Builder do($$:a) {
Column() {
Text($$.msg)
}
}
build() {
Column(){
//把this.message通过引用传递的方式传给do组件
this.do({ msg:this.message} );
Button().onClick(()=>{
this.message="change";
})
}
}
}
```
# @Styles和@Extend装饰器
同样为了代码的复用我们引入了@Styles和@Extend装饰器
@Styles装饰器可以将多条样式设置提炼成一个方法,直接在组件声明的位置调用。通过@Styles装饰器可以快速定义并复用自定义样式。@Styles可以定义在组件内或全局,在全局定义时需在方法名前面添加function关键字,组件内定义时则不需要添加function关键字
@Extend用于扩展原生组件样式且仅支持在全局定义,不支持在组件内部定义。
```
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
handleClick() {
this.message = '已点击';
}
@Styles textstyle() //只能支持通用的属性和通用的事件 也可以定义全局的样式 其不支持传参使样式动态变化
{ .width(100)
.height(100)
}
build() {
Column() {
Text("hello world")
.textstyle() //调用Styles定义样式
Text(this.message)
Button()
.button(this.handleClick.bind(this)) //在函数作用域里无法使用this.handleClick()调用这个函数,我们采用this.handleClick并利用bind绑定this实现组件内的动态刷新
}
}
}
/*extend装饰器只能定义为全局的 格式为@Extend(组件名) function 函数名(){}
extend装饰器支持通过传参动态改变样式,私有属性的定义,以及可以将事件抽象出来作为句柄
*/
@Extend(Button) function button(onClick: () => void){
.fontSize(10)
.onClick(onClick)
}
```
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5