鸿蒙随笔

2024-06-02  本文已影响0人  _菩提本无树_

@Entry装饰的自定义组件,其build()函数下的根节点唯一且必要,且必须为容器组件,其中ForEach禁止作为根节点。
@Component装饰的自定义组件,其build()函数下的根节点唯一且必要,可以为非容器组件,其中ForEach禁止作为根节点。

如果界面单纯作为子组件使用请不要使用@Entry修饰,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。

页面销毁优先销毁主组件,然后是子组件

组件的销毁方式

let show: boolean = true
if (this.show) {
  // 创建子组件,如果中间修改了show的值为false那么子组件将会被销毁
  Child()
}

@Link的使用
使用@Link修饰的内容,在任何位置修改,都会影响所有的值,父子组件也可以
@State也可以但仅限于组件内,无法跨组件
@Prop 是单向的,比如子组件使用了他,然后修改值,不会影响父组件,但是父组件使用了State(或其他指定的装饰符)修饰和他对应的值,会影响子组件

使用@Builder修饰的自定义函数内的UI可以实现复用

@Builder function overBuilder($$: { paramA1: string }) {
  Row() {
  // 注意下面用的是(`)不是(')
    Text(`UseStateVarByReference: ${$$.paramA1} `)
  }
}

按引用传值,相当于oc方法中的正常传值,按值传递相当于oc中传值对象copy一份,传递后的值和当前互不影响,建议使用引用传值,写法如下

@State label: string = "label"
@Builder function overBuilder($$: { paramA1: string }) {
  Row() {
    // 注意下面用的是(`)不是(')
    Text(`UseStateVarByReference: ${$$.paramA1} `)
  }
}

overBuilder({ paramA1: this.label })

@Extend定义扩展组件样式,仅支持定义全局的,但仅限于当前文件使用,不支持export

@Extend(Text) function fancy () {
  .fontColor(Color.Red)
}
上一篇下一篇

猜你喜欢

热点阅读