【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式&结构重用

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式&结构重用

渲染控制包含了条件渲染和循环渲染,所谓条件渲染,即更具状态不同,选择性的渲染不同的组件。

而循环渲染则是用于列表之内的、多个重复元素组成的结构中。

在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句来辅助UI的构建,这些渲染控制语句包括控制组件是否显示的条件渲染语句,基于数组数据快速生成组件的循环渲染语句,针对大数据量场景的数据懒加载语句,针对混合模式开发的组件渲染语句。

渲染控制

条件渲染(if/else)

ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。

ts 复制代码
@Entry
@Component
struct Index {
  @State counter: number = 0;
  build() {
    Column({space: 10}){
      Text(`counter=${this.counter}`)
      Row(){
        if(this.counter===0){
          Text(`counter===0,不展示归零按钮`);
        }else{
          Button('归零').onClick(()=>{
            this.counter=0
          })
        }
      }
      Row(){
        Button('counter++')
          .onClick(()=>{
            this.counter++
          })
      }
    }
  }
}

上文我们实现了一个例子、初始化counter为0,提供一个counter++的按钮,点击时counter+1。

当counter=0时,显示文字:counter=0,不展示归零按钮

否则,展示一个归零按钮

点击归零按钮后,counter赋值0,页面回归初始状态

通过这个例子,就简单掌握了条件渲染的用法。

循环渲染

ForEach接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如,ListItem组件要求ForEach的父容器组件必须为List组件。

用法:

ts 复制代码
// Index.ets
import text from '@ohos.graphics.text';

interface newItem{
  title: string,
  subTitle: string,
  time: string
}

@Entry
@Component
struct Index {
  @State news: newItem[] = [
    {
      title: '新闻标题1',
      subTitle: '这是一个副标题1',
      time: '2024/7/22'
    },
    {
      title: '新闻标题2',
      subTitle: '这是一个副标题2',
      time: '2024/7/22'
    },
    {
      title: '新闻标题3',
      subTitle: '这是一个副标题3',
      time: '2024/7/22'
    }
  ];
  build() {
    Scroll(){
      Column({space:1}){
        ForEach(this.news,(item:newItem)=>{
          Column(){
            Row(){
              Text(item.title)
                .fontSize(22)
            }
            .width('100%')
            Row(){
              Text(item.subTitle)
                .fontColor('#aaa')
            }
            .width('100%')
            Row(){
              Text(item.time)
                .fontColor('#aaa')
            }
            .width('100%')
            .justifyContent(FlexAlign.End)
          }
          .padding(10)
          .border({
            width: {
              bottom: 1
            },
            color: '#ccc',
            style: BorderStyle.Dashed,
          })
          .backgroundColor('rgba(25, 159, 126, 0.1)')
        },(item:newItem,index:number)=>index+'')
      }
      .width('100%')
      .backgroundColor('#eee')
    }
  }
}

样式&结构重用

@Extend:扩展组件(样式、事件)

继承一个组件并且为其添加扩展方法,通过自定义扩展方法就可以添加可复用的样式和事件。

ts 复制代码
// Index.ets
import text from '@ohos.graphics.text';
@Extend(Text)
function textExtend(backgroundColor: ResourceColor,text: string){
  .textAlign(TextAlign.Center)
  .backgroundColor(backgroundColor)
  .fontColor(Color.Red)
  .fontSize(22)
  .width('100%')
  .onClick(() => {
    AlertDialog.show({
      message: text
    })
  })
}
@Entry
@Component
struct Index {
  build() {
    Column(){
      Text('1111')
        .textExtend(Color.Blue,'1111')
      Text('2222')
        .textExtend(Color.Green,'2222')
    }
  }
}

可以看到我们布局时的代码简练了很多

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/56c54cc368704ec7b19409557a6320da.png![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d976cd43e0304160a2b4dca233a799aa.png)


!!!会影响整个页面的该组件,需要注意!!!

@Styles: 抽取通用属性、事件

bash 复制代码
// Index.ets
//'CommonAttribute' 类型
@Styles function textStyle() {
    .backgroundColor('#eee')
    .width('100%')
    .onClick(() => {
      AlertDialog.show({
        message: '点击触发'
      })
    })
}
@Entry
@Component
struct Index {
  build() {
    Column(){
      Text('1111')
        .textStyle()
        .textAlign(TextAlign.Center)
      Text('2222')
        .textStyle()
        .textAlign(TextAlign.Center)
    }
  }
}


特点:

  • 只能设置CommonAttribute类型的属性,也就是通用属性
    像是,TextFont这种只能给Text组件设置的属性无法通过这种方式提取。
  • 无法接收参数
  • 有组件作用域和全局作用域

@Builder:自定义构建函数(结构、样式、事件)

通过@Builder我们可以自定义构建函数,将需要复用的结构、样式、事件通通封装起来。

ts 复制代码
// Index.ets
import text from '@ohos.graphics.text'

@Builder function TextItem(text: string){
  Text(text)
    .fontSize(18)
    .fontColor(Color.Red)
    .backgroundColor('#ccc')
    .lineHeight(30)
    .width('100%')
    .textAlign(TextAlign.Center)
    .onClick(()=>{
      AlertDialog.show({
        message: text
      })
    })
}
@Entry
@Component
struct Index {
  build() {
    Column(){
      TextItem('111')
      TextItem('222')
      TextItem('333')
    }
  }
}

点击后可以触发事件

相关推荐
ANYOUZHEN16 小时前
bugku shell
android
摘星编程16 小时前
React Native鸿蒙:Loading加载动画效果
react native·react.js·harmonyos
Swift社区18 小时前
HarmonyOS 页面路由与导航开发
华为·harmonyos
wdfk_prog18 小时前
[Linux]学习笔记系列 -- [drivers][i2c]i2c-dev
linux·笔记·学习
南宫码农19 小时前
我的电视 - Android原生电视直播软件 完整使用教程
android·开发语言·windows·电视盒子
道亦无名19 小时前
音频数据特征值提取 方法和步骤
android·音视频
希望上岸的大菠萝19 小时前
HarmonyOS 6.0 开发环境搭建完全指南 - DevEco Studio 配置 + 真机调试实战
华为·harmonyos
Lancker19 小时前
定制侠 一个国产纯血鸿蒙APP的诞生过程
android·华为·智能手机·鸿蒙·国产操作系统·纯血鸿蒙·华为鸿蒙
大雷神19 小时前
HarmonyOS智慧农业管理应用开发教程--高高种地--第28篇:用户中心与个人资料
华为·harmonyos
越努力越幸运50820 小时前
CSS3学习之网格布局grid
前端·学习·css3