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

鸿蒙基础篇-ArkTS-语句-类型进阶与渲染控制

“在科技的浪潮中,鸿蒙操作系统宛如一颗璀璨的新星,引领着创新的方向。作为鸿蒙开天组,今天我们将一同踏上鸿蒙基础的探索之旅,为您揭开这一神奇系统的神秘面纱。”

各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今天的学习,

鸿蒙基础篇-ArkTS-语句-类型进阶与渲染控制

对象进阶

定义对象数组

要定义一个对象,首先我们需要定义一个接口,然后根据接口定义对象数组。

// 1. 定义接口
interface Person {
  stuId: number
  name: string
  gender: string
  age: number
}

// 2. 根据接口定义对象数组
let students: Person[] = [
  {stuId: 1, name: '小红', gender: '女', age: 18},
  {stuId: 2, name: '小明', gender: '男', age: 19},
  {stuId: 3, name: '大强', gender: '男', age: 18}
]

使用对象数组

  • 访问某一个对象:
    • 每一对象在数组中都是有对应的下标的, 可以通过 数组名[下标] 访问
  • 访问某一对象的某一个属性
    • 先找到要访问的对象, 在该对象的属性访问属性 数组名[下标].属性名 访问
  • 依次访问每一个对象
    • for ... of 进行访问即可
// 3. 访问属性 数组名[下标].属性名
console.log('小红的年龄是', students[0].age)

// 4. 遍历对象数组
for (const item of students) {
  console.log('学生姓名是', item.name)
}

渲染控制 - ForEach

当我们页面中的区域中有多个样式相同的小区域,只有内容数据不一样的时候, 为了提升代码的复用率,不需要一个一个的编写UI组件,我们可以将所有的数据整合成一个数组, 并采取ForEach进行循环渲染.如下图区域。

而使用ForEach语法进行渲染,就能简单而方便的渲染数据。

ForEach语法

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

  • 语法: ForEach(arr, (item, index) => {})

参数

参数类型

是否必须

参数说明

arr

Array

数据源, 根据该数组生成对应的UI组件渲染到页面中:

  • 可以为空数组

UI组件生成函数

(item?: any, index?: number) => void

UI组件生成函数

  • 为数组中的每个元素创建对应的组件
  • item: 代表每一个数组元素, 类型与数组元素保持一致, 可以省略
  • index: 代表每一个数组元素的下标,可以省略

ForEach使用优化代码

原始代码

@Entry
@Component
struct Index {
  build() {
    Column() {
      Row() {
        Text('唱')
          .fontSize(30)
          .fontColor(Color.Red)
          .fontWeight(700)
          .width('100%')
          .padding(15)
      }
      Row() {
        Text('跳')
          .fontSize(30)
          .fontColor(Color.Red)
          .fontWeight(700)
          .width('100%')
          .padding(15)
      }
      Row() {
        Text('rap')
          .fontSize(30)
          .fontColor(Color.Red)
          .fontWeight(700)
          .width('100%')
          .padding(15)
      }
      Row() {
        Text('篮球')
          .fontSize(30)
          .fontColor(Color.Red)
          .fontWeight(700)
          .width('100%')
          .padding(15)
      }
      Row() {
        Text('music')
          .fontSize(30)
          .fontColor(Color.Red)
          .fontWeight(700)
          .width('100%')
          .padding(15)
      }
      Row() {
        Text('🏀')
          .fontSize(30)
          .fontColor(Color.Red)
          .fontWeight(700)
          .width('100%')
          .padding(15)
      }
    }
  }
}

优化代码

@Entry
@Component
struct Index {
  item: string[] = ['唱', '跳', 'rap', '篮球', '🏀']

  build() {
    Column() {
      Column() {
        ForEach(this.item, (item: string) => {
          Text(item)
            .fontSize(30)
            .fontColor(Color.Red)
            .fontWeight(700)
            .width('100%')
            .padding(15)
        })
      }
    }
  }
}

是不是很简约

接下来,让我们做个案例

案例-菜单点餐

模板代码

@Entry
@Component
struct Index {
  build() {
    Column() {
      Row() {
        Text(`菜名:凉拌白菜 价格:18`)
          .fontSize(18)
          .fontColor('#fff')
        Button('点单+1')
          .backgroundColor('##007dfe')
      }
      .width('100%')
      .height(60)
      .backgroundColor(Color.Blue)
      .borderRadius(5)
      .padding({ left: 10, right: 10 })
      .margin({ bottom: 10 })
      .justifyContent(FlexAlign.SpaceBetween)
    }
    .padding(20)
  }
}

实现思路

  • 准备数据
  • 定义数组元素接口、
  • 根据接口创建对象数组保存数据
  • ForEach循环渲染
  • 使用数组元素的属性(item.属性名)动态填充UI组件对应的位置

实现结果

interface IData {
  name: string;
  price: number;
  count: number;
}

@Entry
@Component
struct Index {
  @State idata: IData[] = [
    {
      name: '凉拌菜',
      price: 18,
      count: 1
    },
    {
      name: '炒河粉',
      price: 15,
      count: 1
    },
    {
      name: '炒米粉',
      price: 15,
      count: 2
    }
  ]

  build() {
    Column() {
      ForEach(this.idata, (item: IData, index) => {
        Row() {
          Text(`菜名:${item.name} 价格:${item.price}`)
            .fontSize(18)
            .fontColor('#fff')
          Button(`点了${item.count}份`)
            .backgroundColor('##007dfe')
            .onClick(() => {
              console.log(`点了${item.count}份`)
              this.idata[index] = {
                name: item.name,
                price: item.price,
                count: item.count += 1
              }
            })
        }
        .width('100%')
        .height(60)
        .backgroundColor(Color.Blue)
        .borderRadius(5)
        .padding({ left: 10, right: 10 })
        .margin({ bottom: 10 })
        .justifyContent(FlexAlign.SpaceBetween)
      })
    }
    .padding(20)
  }
}

注意,如果直接使用: item.count+=1 无法直接实现页面的数据修改,因为@State装饰器无法监听到深层数据的变化,即可以监听到数组的变化,无法监听到数组内的对象的变化。

所以我们要通过修改数组的方式让编译器识别到数据的变化。

Math对象

Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法, Math 用于 Number 类型数据的处理.

对象方法

是否需要参数

方法描述

Math.random()

  • 随机数
  • 取值范围 [0, 1)之间的随机小数,左闭右开, 可以取到0,但是取不到1

Math.ceil()

  • 需要一个数字形参数
  • 总是向上取整

Math.floor()

  • 需要一个数字形参数
  • 总是向下取整

测试

// 1. 随机数
console.log('Math对象', Math.random())  // 0-1 之间的随机小数

// 2. 向上取整
console.log('Math对象', Math.ceil(1.1))  // 2
console.log('Math对象', Math.ceil(1.9))  // 2

// 3. 向下取整
console.log('Math对象', Math.floor(1.1))  // 1
console.log('Math对象', Math.floor(1.9))  // 1

求0--10之间的随机整数

// 0-10 之间的随机数
console.log('Math对象', Math.random() * 11)

// 0-10 之间的随机 整数
console.log('Math对象', Math.floor(Math.random() * 11))

以上是关于鸿蒙基础篇-ArkTS-语句-类型进阶与渲染控制 的一些内容,方便大家学习,至此,关于鸿蒙基础篇-ArkTS-语句-类型进阶与渲染控制 的内容就介绍到这里,愿您能学以致用,开发出精彩的鸿蒙应用!

以上内容仅供学习交流,如有违法或者侵权可以联系删除。


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

相关文章:

  • js、vue、angular中的函数声明方式及特点
  • 详细分析Pytorch中的transpose基本知识(附Demo)| 对比 permute
  • 2021-10-28 51蛋骗鸡独立按键控制LED和蜂鸣器
  • vue 果蔬识别系统百度AI识别vue+springboot java开发、elementui+ echarts+ vant开发
  • 【AIGC】逆向拆解OpenAI官方提示词Prompt技巧:高效提升ChatGPT输出质量
  • vue3中跨层传递provide、inject
  • 生物信息与机器学习6 - 有监督学习算法和无监督学习算法
  • 强势改进!TCN-Transformer时间序列预测
  • 新能源汽车充电桩安装限流式保护器如何选配-安科瑞黄安南
  • 网络安全战略论文学习笔记day2
  • 013:开发软件Visual Studio 2012安装教程
  • 动态规划 - 编辑距离
  • PHP面试题总结
  • 三大专项计划助力教育公平,你准备好了吗?
  • 数字ic/FPGA,Windows/Linux系统,其他相关领域,软件安装包(matlab、vivado、modelsim。。。)
  • MacOS/Macbook用户自定义字体安装教程
  • T级别DDoS攻击与大型DDoS防御
  • 保持HTTP会话状态:缓存策略与实践
  • mint-ui Picker 显示异常
  • 数字信号处理:自动增益控制(AGC)
  • 高频谐振功放电路
  • C语言 | Leetcode C语言题解之第526题优美的排列
  • C++基本语法
  • 如何在Linux系统中使用Ansible进行自动化部署
  • 手机玩潜水员戴夫?GameViewer远程如何随时随地玩潜水员戴夫教程
  • node.js模块化分析