当前位置: 首页 > article >正文

鸿蒙Next条件渲染用法总结

在鸿蒙Next开发中,ArkTS提供了强大的渲染控制能力,其中条件渲染(if/else)可根据应用不同状态显示相应UI内容。以下是对其用法的详细总结。

一、使用规则

1. 语句支持

支持if、else和else if语句,可灵活构建条件判断逻辑。

2. 变量类型

if、else if后的条件语句可使用状态变量(值改变实时渲染UI)或常规变量(值改变不实时渲染UI)。

3. 使用位置

允许在容器组件内使用,构建不同子组件,但要遵循容器组件对子组件的限制。例如,Grid容器内使用条件渲染时,其内部只能使用GridItem组件。

4. 父子关系

条件渲染语句在父子组件关系中是“透明”的,需遵守父组件对子组件的使用规则。

5. 构建函数

每个分支内部的构建函数必须创建一个或多个组件,空构建函数会产生语法错误。

二、更新机制

当if、else if后的状态判断中状态变量值变化时,条件渲染语句更新,步骤如下:

  1. 评估条件判断条件,若分支无变化则停止更新。
  2. 若分支有变化,删除此前构建的所有子组件。
  3. 执行新分支的构造函数,将获取的组件添加到if父容器中(若无else分支则不构建内容)。注意,条件中的表达式不得更改应用程序状态。

三、使用场景

1. 使用if进行条件渲染

  • 示例
@Entry
@Component
struct ViewA {
  @State count: number = 0;
  build() {
    Column() {
      Text(`count=${this.count}`)
      if (this.count > 0) {
        Text(`count is positive`)
         .fontColor(Color.Green)
      }
      Button('increase count')
       .onClick(() => {
          this.count++;
        })
      Button('decrease count')
       .onClick(() => {
          this.count--;
        })
    }
  }
}
  • 原理:初始渲染时,if语句执行构建函数添加子组件。状态变量变化时,重新评估条件,若变化则按更新机制重建UI。如count从0变为1,满足条件后创建新Text组件并添加;count变回0时,该Text组件被删除(无else分支不执行新构造函数)。

2. if…else…语句和子组件状态

  • 示例一(不保留状态)
@Component
struct CounterView {
  @State counter: number = 0;
  label: string = 'unknown';
  build() {
    Column({ space: 20 }) {
      Text(`${this.label}`)
      Button(`counter ${this.counter} +1`)
       .onClick(() => {
          this.counter += 1;
        })
    }
   .margin(10)
   .padding(10)
   .border({ width: 1 })
  }
}

@Entry
@Component
struct MainView {
  @State toggle: boolean = true;
  build() {
    Column() {
      if (this.toggle) {
        CounterView({ label: 'CounterView #positive' })
      } else {
        CounterView({ label: 'CounterView #negative' })
      }
      Button(`toggle ${this.toggle}`)
       .onClick(() => {
          this.toggle =!this.toggle;
        })
    }
   .width('100%')
   .justifyContent(FlexAlign.Center)
  }
}
  • 解释:CounterView(label为’CounterView #positive’)子组件初渲染时创建,含状态变量counter。修改counter时该子组件重渲染保留值。但当MainView.toggle变为false,原CounterView子组件被删,新建CounterView(label为’CounterView #negative’)实例且counter设为初始值0,因为if分支更改不更新现有子组件且不保留状态。

  • 示例二(保留状态)

@Component
struct CounterView {
  @Link counter: number;
  label: string = 'unknown';
  build() {
    Column({ space: 20 }) {
      Text(`${this.label}`)
       .fontSize(20)
      Button(`counter ${this.counter} +1`)
       .onClick(() => {
          this.counter += 1;
        })
    }
   .margin(10)
   .padding(10)
   .border({ width: 1 })
  }
}

@Entry
@Component
struct MainView {
  @State toggle: boolean = true;
  @State counter: number = 0;
  build() {
    Column() {
      if (this.toggle) {
        CounterView({ counter: $counter, label: 'CounterView #positive' })
      } else {
        CounterView({ counter: $counter, label: 'CounterView #negative' })
      }
      Button(`toggle ${this.toggle}`)
       .onClick(() => {
          this.toggle =!this.toggle;
        })
    }
   .width('100%')
   .justifyContent(FlexAlign.Center)
  }
}
  • 说明:此处@State counter变量归父组件,子组件通过@Link引用。当CounterView实例删除时变量不销毁,从而在条件更改时保留counter值。

3. 嵌套if语句

  • 示例
@Entry
@Component
struct CompA {
  @State toggle: boolean = false;
  @State toggleColor: boolean = false;
  build() {
    Column({ space: 20 }) {
      Text('Before')
       .fontSize(15)
      if (this.toggle) {
        Text('Top True, positive 1 top')
         .backgroundColor('#aaffaa').fontSize(20)
        // 内部if语句
        if (this.toggleColor) {
          Text('Top True, Nested True, positive COLOR  Nested ')
           .backgroundColor('#00aaaa').fontSize(15)
        } else {
          Text('Top True, Nested False, Negative COLOR  Nested ')
           .backgroundColor('#aaaaff').fontSize(15)
        }
      } else {
        Text('Top false, negative top level').fontSize(20)
         .backgroundColor('#ffaaaa')
        if (this.toggleColor) {
          Text('positive COLOR  Nested ')
           .backgroundColor('#00aaaa').fontSize(15)
        } else {
          Text('Negative COLOR  Nested ')
           .backgroundColor('#aaaaff').fontSize(15)
        }
      }
      Text('After')
       .fontSize(15)
      Button('Toggle Outer')
       .onClick(() => {
          this.toggle =!this.toggle;
        })
      Button('Toggle Inner')
       .onClick(() => {
          this.toggleColor =!this.toggleColor;
        })
    }
   .width('100%')
   .justifyContent(FlexAlign.Center)
  }
}
  • 原理:条件语句嵌套不影响父组件规则,可按需求构建复杂条件判断逻辑,通过外层和内层if语句及状态变量控制UI显示。

掌握鸿蒙Next的条件渲染用法,能根据应用状态精准控制UI展示,提升应用的交互性和用户体验。在实际开发中,需根据具体场景灵活运用这些规则和特性。


http://www.kler.cn/a/442313.html

相关文章:

  • 网络安全面试题汇总(个人经验)
  • Linux网络 TCP socket
  • 如何在 Rocky Linux 上安装极狐GitLab?
  • openharmony标准系统方案之瑞芯微RK3568移植案例
  • SpringBoot入门实现简单增删改查
  • 【Node.js的安装与配置】
  • GPT 时代,精进编程思维 + 熟练 Prompt 是否是新的编程范式?
  • HTMLCSS:3D动态卡车
  • ChatGPT生成测试用例的最佳实践(三)
  • 设计模式——单例模式(饿汉式,懒汉式等)
  • 用户输入 %%%% , MYSQL中数据全被查询出来的Bug(GORM)
  • Java程序员如何高效学习Spring Cloud Alibaba?
  • 【ETCD】ETCD 架构揭秘:内部各组件概览
  • 基于 SSM 和 Vue 架构的新锐台球厅管理系统:创新设计引领高效实现
  • RabbitMQ中的Publish-Subscribe模式
  • 单片机:实现教学上下课的自动打玲(附带源码)
  • 【数理统计】极限定理及抽样分布
  • python之求平面离散点集围成的面积
  • Qt 开发笔记2
  • 深度学习之循环神经网络及进化(RNN-LSTM-GRU)
  • 安防监控Liveweb视频汇聚融合平台助力执法记录仪高效使用
  • 快消品 B2B 困境与破局:基于 2+1 链动模式与 S2B2C 商城小程序的思考
  • Starting MySQL.... ERROR! The server quit without updating PID file解决方案
  • 低延迟!实时处理!中软高科AI边缘服务器,解决边缘计算多样化需求!
  • Windows生态圈:如何改变我们的数字生活
  • Linux高性能服务器编程中的TCP带外数据梳理总结