写点什么

《ArkTS 渲染控制完全指南:条件与循环渲染深度解析》

作者:Turing_010
  • 2025-06-07
    广东
  • 本文字数:3062 字

    阅读完需:约 10 分钟

《ArkTS渲染控制完全指南:条件与循环渲染深度解析》

##Harmony OS Next ##Ark Ts ##教育本文适用于教育科普行业进行学习,有错误之处请指出我会修改。


😎 ArkTS 条件渲染超全指南 | 手把手玩转 UI 动态切换



🌟 核心能力速览

  • 智能条件判断:用if/else if/else像搭积木一样控制 UI 显示

  • 实时响应变化:状态变量一变,UI 自动刷新超丝滑~

  • 灵活嵌套组合:支持多层条件判断,满足复杂场景需求

  • 版本兼容性:从 API 9 开始支持卡片开发哦!✨



🚨 使用必读规则(重点!)

// 📌 基础写法模板if(条件1) {    // 组件1} else if(条件2) {    // 组件2} else {    // 默认组件}
复制代码




🔄 更新机制揭秘

1️⃣ 条件检测 → 2️⃣ 旧组件删除 → 3️⃣ 新组件创建状态变量变动的瞬间,ArkTS 就会上演这出"三幕剧"!



🎯 实战代码教学

🔥 场景 1:数字正负判断

@Entry@Componentstruct MyComponent {  @State count: number = 0; // 🎮 核心控制变量
build() { Column() { Text(`当前计数:${this.count}`) // 实时显示 // 🎨 条件渲染核心区 if (this.count > 0) { Text('正数!').fontColor(Color.Green) // 绿色提示 } else if (this.count < 0) { Text('负数!').fontColor(Color.Red) // 红色警告 }
Button('+1').onClick(() => this.count++) // ➕按钮 Button('-1').onClick(() => this.count--) // ➖按钮 } }}
复制代码


💡 运行效果:点击按钮改变数值,文字颜色自动切换!



🎮 场景 2:带状态保存的计数器

@Componentstruct CounterView {  @Link counter: number; // 🔗 关键链接装饰器  label: string = 'unknown';
build() { Column({ space: 20 }) { Text(this.label).fontSize(20) Button(`点击+1 → ${this.counter}`) .onClick(() => this.counter += 1) } .border({ width: 1 }) // 边框样式 }}
@Entry@Componentstruct MainView { @State toggle: boolean = true; @State counter: number = 0; // 🏦 状态统一管理
build() { Column() { if (this.toggle) { CounterView({ counter: $counter, label: '正向计数器' }) } else { CounterView({ counter: $counter, label: '反向计数器' }) } Button(`切换模式 ${this.toggle}`) .onClick(() => this.toggle = !this.toggle) } }}
复制代码


✨ 亮点解析:使用@Link实现状态共享,切换模式不丢数据!



⚠️ 避坑指南

动画切换 crash 问题

错误示范


if (this.data1) {  Text(this.data1.str) // ❌ 直接使用可能为空的数据}
复制代码


✅ 正确姿势:​​方案 1​​:双保险判空


Text(this.data1?.str) // 🛡️ 安全访问操作符
复制代码


方案 2:禁用默认动画


Text(this.data1.str)  .transition(TransitionEffect.IDENTITY) // 🚫 禁用过渡效果
复制代码



🧠 高阶技巧

嵌套 if 的炫酷玩法


if(外层条件){  Text("外层成立")  if(内层条件){    Text("双条件达成!").backgroundColor('#00ff00')  }} else {  Text("外层不成立").backgroundColor('#ff0000')}
复制代码


📌 重要提示:嵌套 if 也要遵守父容件的组件规则哦!




🎉 ArkTS ForEach 终极指南 | 花式玩转列表渲染



🌟 核心能力三连击

  • 批量生成:像打印机一样唰唰唰生成列表项

  • 智能复用:数据变我只变该变的部分,性能起飞🚀

  • 动态响应:数组增删改查自动同步 UI,超贴心~



🚨 必看避坑指南

// ✅ 正确姿势:对象用唯一IDForEach(userList, (item) => UserCard(item), (item) => item.id)
// ❌ 作死写法:用index当keyForEach(userList, (item) => UserCard(item), (item, index) => index)
复制代码




🔑 键值生成黑科技

  • 默认生成公式(item, index) => index + '__' + JSON.stringify(item)

  • 自定义秘籍:通过 keyGenerator 函数打造专属密钥


ForEach(data,   item => ItemComponent(item),  item => `${item.type}_${item.timestamp}` // ✨ 自定义复合键)
复制代码



🎯 四大实战场景

1️⃣ 静态列表(骨架屏加载)

@Entry@Componentstruct SkeletonScreen {  @State loadingData: number[] = [1,2,3,4,5]
build() { List() { ForEach(this.loadingData, () => SkeletonItem(), item => item.toString() ) } }}
@Builderfunction SkeletonItem() { Row() { Circle().width(60).height(60) // 头像占位 Column() { Rect().width('80%').height(20) // 标题占位 Rect().width('60%').height(15) // 副标题占位 } }.padding(10)}
复制代码


💡 效果:加载时展示灰色块状骨架,数据到位后无缝切换真实内容



2️⃣ 动态增删(朋友圈加载更多)

@Observedclass Moment {  id: string  content: string  likes: number
constructor(id: string, content: string) { this.id = id this.content = content this.likes = 0 }}
@Entry@Componentstruct MomentsList { @State moments: Moment[] = [ new Moment('001', '今天天气真好🌞'), new Moment('002', '新买的球鞋到了👟') ]
loadMore() { // 模拟加载新数据 this.moments.push(new Moment('003', '深夜放毒🍔')) }
build() { List() { ForEach(this.moments, (item) => MomentItem(item), item => item.id ) LoadMoreButton().onClick(() => this.loadMore()) } }}
复制代码


✨ 亮点:上滑自动加载,新增数据丝滑插入列表底部



3️⃣ 属性更新(点赞特效)

@Observedclass Post {  id: string  isLiked: boolean  likesCount: number
constructor(id: string) { this.id = id this.isLiked = false this.likesCount = 0 }}
@Componentstruct LikeButton { @ObjectLink post: Post
build() { Row() { Image(this.post.isLiked ? 'like_filled' : 'like_outline') .onClick(() => { this.post.isLiked = !this.post.isLiked this.post.likesCount += this.post.isLiked ? 1 : -1 }) Text(`${this.post.likesCount}`) } }}
复制代码


🔥 动效:点击爱心图标即时更新状态,数字跳动动画超带感



4️⃣ 拖拽排序(自定义列表顺序)

@Entry@Componentstruct DraggableList {  @State items: string[] = ['A', 'B', 'C', 'D']
build() { List() { ForEach(this.items, (item) => { ListItem() { Text(item).fontSize(24) } .dragStart(true) // ✨ 启用拖拽 }, item => item ) .onMove((from, to) => { // 数据位置交换 [this.items[from], this.items[to]] = [this.items[to], this.items[from]] }) } }}
复制代码


🎮 操作:长按项目自由拖动,松手后自动排序



⚠️ 血泪教训总结

  1. Key 值雷区❗ 绝对不要用 index 当 key!会导致:

  2. 组件错误复用

  3. 状态混乱

  4. 性能急剧下降

  5. 对象更新玄机


   // ❌ 错误更新方式   this.posts[0] = new Post('new') // 框架无法感知!      // ✅ 正确更新姿势   this.posts.splice(0, 1, new Post('new')) // 触发响应式更新
复制代码


  1. 动画优化技巧给动态元素添加过渡效果:


   Text('重要提示')     .transition({ type: TransitionType.Insert, opacity: 0 })     .transition({ type: TransitionType.Delete, scale: 0 })
复制代码



🚀 性能优化宝典




🌈 掌握这些姿势,你就是 ArkTS 列表渲染大师!快去打造丝滑流畅的列表界面吧~

用户头像

Turing_010

关注

还未添加个人签名 2025-05-22 加入

还未添加个人简介

评论

发布
暂无评论
《ArkTS渲染控制完全指南:条件与循环渲染深度解析》_Turing_010_InfoQ写作社区