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

学习鸿蒙基础(4)

1.条件渲染
ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。
当if、else if后跟随的状态判断中使用的状态变量值变化时,条件渲染语句会进行更新。。

@Entry
@Component
struct PageIfElse {@State list: Object [] = []build() {Row() {Column() {Button("onClick").onClick(()=>{this.list=[{ id: 1, name: "房子",type:1 },{ id: 2, name: "车子",type:2 },{ id: 3, name: "票子",type:3} ,{ id: 1, name: "理想",type:1 },{ id: 2, name: "现实",type:2 },{ id: 3, name: "梦想",type:3}]})if(this.list.length){List(){ForEach(this.list,(item:Object)=>{ListItem(){getOrder(item)}.margin(10)},item=>JSON.stringify(item))}.height(200)}else{Text("三无青年")}}.width('100%')}.height('100%')}
}@Builder
function  getOrder(item){Row(){Text(item["name"]).fontSize(18).fontColor("#333333")if(item["type"]==1){Text("一座").fontSize(19).fontColor(Color.Red)}else if(item["type"]==2){Text("二辆").fontSize(19).fontColor(Color.Red)}else if(item["type"]==3){Text("三捆").fontSize(19).fontColor(Color.Red)}}.justifyContent(FlexAlign.SpaceBetween).width("100%")
}

 2.自定义组件

在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行Ul界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成自定义组件是不可或缺的能力。
自定义组件具有以下特点:
1、可组合:允许开发者组合使用系统组件、及其属性和方法。
2、可重用:自定义组件可以被其他组件重用,并作为不同的实例在不同的父组件或容器中使用。
3、数据驱动UI更新:通过状态变量的改变,来驱动UI的刷新。


struct:自定义组件基于struct实现,struct +自定义组件名+..}的组合构成自定义组件,不能有继承关系。对于struct的实例化,可以省略new。
@Component: @Component装饰器仅能装饰struct关键字声明的数据结构。struct被@Component装饰后具备组件化的能力,需要实现build方法描述UI,一个struct只能被一个@Component装饰。
@Entry: @Entry装饰的自定义组件将作为UI页面的入口。在单个UI页面中,最多可以使用@Entry装饰一个自定义组件。
build()函数中需注意: build()函数用于定义自定义组件的声明式UI描述,自定义组件必须定义build()函数。
build()函数下的根节点唯一且必要,且必须为容器组件,其中ForEach禁止作为根节点。build()函数下:
1、不允许声明本地变量。
2、不允许在UI描述里直接使用console.info(),但允许在方法或者函数里使用。
3、不允许调用没有用@Builder装饰的方法。
4、不允许switch语法,如果需要使用条件判断,请使用if。
5、不允许使用表达式,比如三目运算。

 代码示例:

自定义组件需要新建一个components的文件夹。将自定义组件拷贝在里面。


import Item from '../model/Item';
//自定义组件  组件与组件之间是隔离的
@Component
struct myList {private item: Item;private index: number;private list: Item [];@State isChecked:boolean =falsebuild() {Row() {Checkbox().onChange(v=>{console.log(v.toString())this.isChecked=v})Text(this.item.text).fontSize(20).decoration({type:this.isChecked?TextDecorationType.Underline:TextDecorationType.None,color:Color.Blue})Button("删除").backgroundColor(Color.Red).onClick(() => {this.list.splice(this.index, 1)})}.justifyContent(FlexAlign.SpaceBetween).width("100%")}
}export default myList

自己新建的对象需要新建一个model文件夹。对象是普通的ts文件。


class Item {id: number;text: string;constructor(id: number, text: string) {this.id = idthis.text = text}
}export  default Item

DEMO运行效果如下

 自定义组件demo如下:

import myList from '../components/myList'
import Item from '../model/Item'
@Entry
@Component
struct PageIfElse {@State text: string = ''@State list: Item [] = [new Item(Date.now(), "房子"),new Item(Date.now(), "车子")]build() {Row() {Column() {Row() {TextInput({ text: this.text }).width(250).onChange((value) => {this.text = value})Button("增加").onClick(() => {this.list.push(new Item(Date.now(), this.text))this.text = ""}).margin(10)}.width("100%").justifyContent(FlexAlign.SpaceBetween).margin(10)List() {ForEach(this.list, (item, index) => {ListItem() {myList({ item, index, list: this.list })}.margin(10)})}.layoutWeight(1).divider({strokeWidth: 1,color: Color.Blue,startMargin: 10,endMargin: 10}).width('100%')}}.height('100%')}
}

相关文章:

  • python加载模块
  • 【工具类】开源照片管理工具pthtoprism
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • 【Docker】初学者 Docker 基础操作指南:从拉取镜像到运行、停止、删除容器
  • 【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理
  • 可变形注意力(Deformable Attention)及其拓展
  • 【Linux进程】冯·诺依曼体系结构以及操作系统的深入理解
  • this的指向问题总结
  • 【深度学习:计算机视觉】计算机视觉的最佳数据集 [行业细分]
  • 常见锁策略,CAS,synchrodized原理讲解
  • 企业微信机器人的运营策略与实践
  • LeetCode 热题 100 | 二叉树(终)
  • 基于springboot+vue的中小型医院网站(前后端分离)
  • 零基础到高级:Android音视频开发技能路径规划
  • 数智赋能,变革加速:人工智能技术与低代码开发利器
  • 自己简单写的 事件订阅机制
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • crontab执行失败的多种原因
  • Elasticsearch 参考指南(升级前重新索引)
  • JS专题之继承
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • SwizzleMethod 黑魔法
  • use Google search engine
  • 产品三维模型在线预览
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 技术:超级实用的电脑小技巧
  • 力扣(LeetCode)56
  • 聊聊redis的数据结构的应用
  • 入手阿里云新服务器的部署NODE
  • 深入浅出webpack学习(1)--核心概念
  • 项目管理碎碎念系列之一:干系人管理
  • NLPIR智能语义技术让大数据挖掘更简单
  • puppet连载22:define用法
  • 阿里云ACE认证学习知识点梳理
  • 阿里云重庆大学大数据训练营落地分享
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #1015 : KMP算法
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (27)4.8 习题课
  • (6)添加vue-cookie
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (python)数据结构---字典
  • (独孤九剑)--文件系统
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)linux 命令大全
  • .Family_物联网
  • .Net 路由处理厉害了
  • .net中我喜欢的两种验证码
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?