美文网首页
自定义构建函数

自定义构建函数

作者: 家乡的蝈蝈 | 来源:发表于2024-01-18 10:50 被阅读0次

1、自定义构建函数

1.1、构建函数- @Builder

  如果你不想在直接抽象组件,ArkUI还提供了一种更轻量的UI元素复用机制 @Builder,可以将重复使用的UI元素抽象成一个方法,在 build 方法里调用。称之为自定义构建函数

  • 用法- 使用@Builder修饰符修饰

1.1.1、全局自定义 @Builder function name () {}

  全局自定义函数指在struct外面的函数

@Builder
function getCellContent(leftTitle: string, rightValue: string) { // 全局自定义函数带function
  Row() {
    Row() {
      Text(leftTitle)
      Text(rightValue)
    }
    .width('100%')
    .justifyContent(FlexAlign.SpaceBetween)
    .padding({
      left: 15,
      right: 15
    })
    .borderRadius(8)
    .height(40)
    .backgroundColor(Color.White)
  }.padding({
    left: 10,
    right: 10
  })
}

在组件中使用

Column({space:10}) {
        getCellContent("时间", "2023-12-12")
        getCellContent("位置", "上海")
        getCellContent("爱好", "乒乓")
      }

全局自定义函数的问题
● 全局的自定义构建函数可以被整个应用获取(下一代可用-当前4.0暂不支持),不允许使用this和bind方法。
● 如果不涉及组件状态变化,建议使用全局的自定义构建方法。
● 补一句-如果数据是响应式的-此时该函数不会自动渲染-哪怕是全局自定义函数,不可被其他文件引用
将数据声明为State响应式数据

class CardClass {
  time: string = ""
  location: string = ""
  type: string = ""
}
@State formData: CardClass = {
    time: "2023-12-12",
    location: '回龙观',
    type: '漏油'
  }

传递数据,绑定为对应字段

Column({ space: 10 }) {
        getCellContent("异常时间", this.formData.time)
        getCellContent("异常位置", this.formData.location)
        getCellContent("异常类型", this.formData.type)
        Button("修改数据").onClick(() => {
          this.formData.location = "望京"
        })
      }
      .width('100%')

  我们发现,点击修饰是没有任何反应的,说明此时即使你用了State,但是此时的全局builder依然不更新

1.1.2、组件内定义- 语法 @Builder name () {}

@Entry
@Component
struct BuilderCase {
  @Builder
  getCellContent(leftTitle: string, rightValue: string) { // 组件内自定义函数不带function 
    }
}

调用

this.getCellContent("异常时间", this.formData.time)

  调用多了this,其他和全局属性一样,没有任何变化,此时我们发现修改数据依然没有任何变化
  注意: 我们刚刚传过去的是类型,string是一个基础数据类型,它是按值传递的,不具备响应式更新的特点
总结

  • 全局Builder函数和组件Builder构建函数可以实现一种轻量级的UI复用,
  • 区别: 全局自定义构建函数不允许使用this,bind,它适合一种纯渲染的UI结构;组件内自定义Builder可以实现this调用

1.2、参数传递

自定义构建函数的参数传递有按值传递按引用传递两种,均需遵守以下规则:

  • 参数的类型必须与参数声明的类型一致,不允许undefined、null和返回undefined、null的表达式。
  • 在自定义构建函数内部,不允许改变参数值。如果需要改变参数值,且同步回调用点,建议使用@Link
  • @Builder内UI语法遵循UI语法规则
  • 只有传入一个参数,且参数需要直接传入对象字面量才会按引用传递该参数,其余传递方式均为按值传递。

 1)、使用了string这种基础数据类型,即使它属于用State修饰的变量,也不会引起UI的变化
 2)、按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。ArkUI提供$$作为按引用传递参数的范式。

ABuilder( $$ : 类型 );
函数名称( obj: 类型 );

 3)、也就是我们需要在builder中传入一个对象, 该对象使用$$(可使用其他字符)的符号来修饰,此时数据具备响应式了

@Entry
@Component
struct BuilderCase {
  @State formData: CardClass = {   // state修饰的状态变量
    time: "2023-12-12",
    location: '回龙观',
    type: '漏油'
  }
  @Builder
  getCellContent($$: CellParams) { // 传入一个对象,$$可以为任意字符
    Row() {
      Row() {
        Text($$.leftTitle)
        Text($$.rightValue)
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)
      .padding({
        left: 15,
        right: 15
      })
      .borderRadius(8)
      .height(40)
      .backgroundColor(Color.White)
    }.padding({
      left: 10,
      right: 10
    })
  }
  build() {
    Row() {
      Column() {
        Column({ space: 10 }) {
          this.getCellContent({ leftTitle: '异常时间', rightValue: this.formData.time }) // 传入一个对象,且有state修饰符修饰的变量
          this.getCellContent({ leftTitle: '异常位置', rightValue: this.formData.location }) // 传入一个对象,且有state修饰符修饰的变量
          this.getCellContent({ leftTitle: '异常类型', rightValue: this.formData.type })
        }
        .width('100%')
        Button("修改数据").onClick(() => {
          this.formData.location = "望京" // 修改state修改是的对象的属性,可以导致UI更新
        })
      }
      .width('100%')
    }
    .height('100%')
    .backgroundColor('#ccc')
  }
}

● 使用 @Builder 复用逻辑的时候,支持传参可以更灵活的渲染UI
● 参数可以使用状态数据,通过对象的方式传入 @Builder

相关文章

  • Python-自定义函数

    自定义函数及调用 创建一个专门存放自定义函数的文件夹 D:\python\customize 构建一个简单的函数 ...

  • Keras多输出模型构建

    1、多输出模型 使用keras函数式API构建网络: 2、自定义loss函数 3、批量训练 4、调试 在自定义的l...

  • python3基础07函数(自定义)

    本文介绍python中自定义函数的构建;参数传递;模块中调用函数。首发于本人公众号:pythonic生物人 更好的...

  • NuLink月报 2021-12

    技术进展 修改Nuproxy和Pallet协议函数 构建自定义链规范 增加单元测试和函数测试样本 增加JS测试案例...

  • onLayout, onMeasure, onDraw方法

    重载onMeasure(),onLayout(),onDraw()三个函数构建了自定义View的外观形象。再加上o...

  • 基于收支模拟花呗还款情况 2019-05-29

    收支情况模拟构建思路:1、构建税收函数2、构建专项扣除函数3、构建社保函数4、构建奖金函数5、构建10年(即120...

  • 浅谈原型和原型链?

    构造函数是为了构建一个自定义类,并且创建这个类的实例 构造函数其实一个普通的函数,不同的是构造函数的首字母要大写,...

  • mysql-自定义函数

    创建自定义无参数函数 调用自定义函数 创建有参数的自定义函数 调用有参数的自定义函数 创建具有复合结构的自定义函数...

  • 9.MySQL自定义函数

    自定义函数 自定义函数的两个必要条件 参数 返回值 创建自定义函数 函数体 例子 带有参数的自定义函数 删除函数 ...

  • 知识的了解(自定义view,5种通讯)

    1.自定义view的步骤开始: 1.重载构建函数(做一些初始化的操作,并获取自定义的属性)2.onMeasure(...

网友评论

      本文标题:自定义构建函数

      本文链接:https://www.haomeiwen.com/subject/dealodtx.html