• 作者:老汪软件技巧
  • 发表时间:2024-08-30 00:02
  • 浏览量:

鸿蒙开发|自定义组件基础&&@Prop的使用

今天的内容分为以下几点:

自定义组件的基础用法,让我们对其有一个初步了解在自定义组件中,@Prop的作用自定义组件

前言:在UI界面开发中,我们不可避免的会遇到组件的复用,逻辑业务与UI分离、对代码的升级与维护的情况。这时候使用自定义组件,可以提高我们的工作效率,提高代码的简便程度,以及方便我们更好的对代码进行维护与升级。

那么,自定义组件有哪些特点呢?

可组合:在鸿蒙中,允许开发者组合使用系统组件,以及其属性、方法。

可重用:自定义组件可以被其他组件重用,并且可以作为不同的实例在父组件中使用

数据驱动UI更新:在自定义组件中,通过状态变量的改变,也会引起UI的更新

下面正式介绍自定义组件的基本用法:

注意:在自定义组件中

不支持静态函数、静态成员变量

成员函数、变量均为私有

1.自定义组件的结构:@Compontent:@Compontent装饰器仅能装饰struct关键字声明的数据结构。struct: 被@Compontent修饰的struct具备组件化的能力,但是需要实现build方法描述UI 。用法:struct+自定义组件名{build(){....}}build()函数:用于自定义组件的声明UI描述,并且自定义组件必须定义build()函数

//自定义组件
@Component
struct Son {
  build() {
  
    
  }
}

2.自定义组件的使用:

在创建自定义组件前,我们必须要知道**@Entry**:@Entry作为修饰的自定义组件作为UI界面的入口,一个UI页面,只能有一个@Entry

//自定义组件
@Component
struct Son {
  build() {
  Text("好帅")
    
  }
}

在父组件中使用,我们可以在组件中复用多次自定义组件

在自定义组件中,我们通过build函数,可以添加想要的系统组件及样式,同时还可以定义其他的成员函数,以及成员变量

@Component
struct Son {
  //状态变量
  @State name: string = "真的帅"
  //成员函数
  sayHai: () => void = () => {
  }
  //普通变量
  username:string=""
  build() {
      //系统组件
    Column() {
      Text("好帅")
      Text(this.name)
    }.width("100%")
  }
}

那么在父组件中,我们可以通过传参数的方式,来覆盖自定义组件成员变量的值,使UI界面刷新

在使用子组件的时候,我们必须要明确,自定义组件通过点语法的形式只能设置通用样式,通用事件

鸿蒙自定义组件_华为鸿蒙组件模块_

@Entry
@Component
struct Index {
  build() {
    Column() {
      Son({ name: "父组件内容" })
        //通用的事件及样式属性,如onChange、fontColor、都无法使用
        .onClick(()=>{})
        .width("100%")
       .height("100%")
    }.width("100%")
     .height("100%")
  }
}

3.下面我们着重介绍下 父组件与子组件之间传递逻辑

父组件给子组件传递逻辑

将父组件中的函数传递给子组件,并在子组件中调用,将箭头函数写在哪,this就指向谁


  build() {
    Column() {
      Button("父组件" + this.num)
      Son({
        num: this.num, onAddL: () => {
          //父组件改变
          this.num--
        }
      })
    }.width("100%")
    .height("100%")

2.普通函数,谁调用函数,this就指向谁

  build() {
    Column() {
      Button("父组件" + this.num)
      Son({
        num: this.num, onAddL() {
          this.num--
        }
      })
    }.width("100%")
    .height("100%")
  }
}

3.最后我们来了解一下**@Prop**:@Prop 装饰的变量可以和父组件建立单向的同步关系。@Prop 装饰的变量是可变的,但是变化不会同步回其父组件。@prop修饰的状态变量改变,UI会刷新

简单来说就是子组件会随着父组件状态变量的改变而改变,但是如果子组件改变,父组件是不会改变的,并且父组件如果这时发生改变,会将变量的值覆盖给子组件

我们来一个一个实现一下吧

单向同步,子随父发生同步改变

2.直接在子组件下添加点击事件改变子组件数值,父组件不发生改变,

@Component
struct Son {
  @Prop num: number = 0
  build() {
    Column() {
      Button("子组件" + this.num)
      //子组件改变
        .onClick(() => {
          this.num--
        })
    }
  }
}

3.在子组件和父组件下都添加点击事件,当子组件改变的同时,父组件改变,子组件会随着父组件而改变

@Entry
@Component
struct Index {
  @State num: number = 100
  build() {
    Column() {
      Button("父组件" + this.num)
        .onClick(() => {
          this.num++
        })
      Son({ num: this.num })
    }.width("100%")
  }
}
@Component
struct Son {
  @Prop num: number = 0
  build() {
    Column() {
      Button("子组件" + this.num)
        .onClick(() => {
          this.num--
        })
    }
  }
}

如果想要实现在@prop修饰下,子组件的值发生改变,父组件也会发生改变。我们需要利用函数回调,将子组件的数据传给父组件