@Once:初始化同步一次
想要实现仅从外部初始化一次且不接受后续同步变化的能力,可以使用@Once装饰器搭配@Param装饰器。
阅读本文档前,请先阅读@Param。
说明
从API version 12开始,在@ComponentV2装饰的自定义组件中支持使用@Once装饰器。
从API version 12开始,该装饰器支持在元服务中使用。
概述
@Once装饰器在变量初始化时接受外部传入值进行初始化,后续数据源更改不会同步给子组件:
- @Once必须搭配@Param使用,单独使用或搭配其他装饰器使用都是不允许的。
- @Once不影响@Param的观测能力,仅针对数据源的变化做拦截。
- @Once与@Param装饰变量的先后顺序不影响使用功能。
- @Once与@Param搭配使用时,可以在本地修改@Param变量的值。
装饰器使用规则说明
@Once装饰器作为辅助装饰器,本身没有装饰类型要求和变量观察能力。
| @Once变量装饰器 | 说明 |
|---|---|
| 装饰器参数 | 无。 |
| 使用条件 | 无法单独使用,必须配合@Param装饰器使用。 |
@Once使用限制
@Once仅在@ComponentV2装饰的自定义组件中与@Param搭配使用,否则报错。
@Once与@Param的先后顺序无关,可以写成@Param @Once也可以写成@Once @Param。
使用场景
变量仅初始化同步一次
@Once用于期望变量仅初始化同步数据源一次,之后不再继续同步变化的场景。
本地修改@Param变量
当@Once与@Param结合使用时,可以解除@Param无法在本地修改的限制,并能够触发UI刷新。此时,使用@Param和@Once的效果类似于@Local,但@Param和@Once还能接收外部传入的初始值。
@Event装饰器
@Event主要配合@Param实现数据的双向同步。在阅读本文档前,建议提前阅读:@Param。
说明
从API version 12开始,在@ComponentV2装饰的自定义组件中支持使用@Event装饰器。
从API version 12开始,该装饰器支持在元服务中使用。
概述
由于@Param装饰的变量在本地无法更改,子组件使用@Event装饰器装饰回调方法属性并在父组件中设置该回调的实现,可以实现子组件调用回调更新父组件数据源变量,再通过@Local的同步机制,将修改同步回@Param装饰的子组件变量,以此达到主动更新@Param装饰变量的效果。
@Event用于装饰组件对外输出的方法:
@Event装饰的回调方法中参数以及返回值由开发者决定。
@Event装饰非回调类型的变量不会生效。当@Event没有初始化时,会自动生成一个空的函数作为默认回调。
当@Event未被外部初始化,但本地有默认值时,会使用本地默认的函数进行处理。
@Param标志着组件的输入,表明该变量受父组件影响,而@Event标志着组件的输出,可以通过该方法影响父组件。使用@Event装饰回调方法是一种规范,表明该回调作为自定义组件的输出。父组件使用子组件时,如果设置了子组件通过@Event标记的回调函数,则子组件可以调用回调函数更改@Param变量的数据源。
装饰器说明
| @Event属性装饰器 | 说明 |
|---|---|
| 装饰器参数 | 无。 |
| 允许装饰的变量类型 | 回调方法,例如()=>void、(x:number)=>boolean等。回调方法是否含有参数以及返回值由开发者决定。 |
| 允许传入的函数类型 | 箭头函数。 |
限制条件
@Event只能用在@ComponentV2装饰的自定义组件中。当装饰非方法类型的变量时,不会有任何作用。当装饰@Component组件中的属性/方法时,编译报错。
使用场景
更改父组件中变量
使用@Event可以更改父组件中变量,当该变量作为子组件@Param变量的数据源时,该变化会同步回子组件的@Param变量。
值得注意的是,使用@Event修改父组件的值是立刻生效的,但从父组件将变化同步回子组件的过程是异步的,即在调用完@Event的方法后,子组件内的值不会立刻变化。这是因为@Event将子组件值实际的变化能力交由父组件处理,在父组件实际决定如何处理后,将最终值在渲染之前同步回子组件。