百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

鸿蒙ArkTS+ArkUI仿微信消息列表页制作

zhezhongyun 2025-07-02 00:09 28 浏览

先放一下页面效果:

第一步我们先定义一下数据格式,创建一个数据模型,通过图片,可以看到每一条数据的字段应当包括:头像,姓名,最新消息内容和最新消息的时间,创建一个model文件夹,然后在里面新建一个_Chat.ets文件

这里我使用的是interface来定义,当然也有很多人习惯class,类和接口的区别大概就是,interface里不包括代码,只是定义了一种实现规范

代码如下:

```javascript

export interface Info{

name:string

img:Resource

day:string

last:string

}

```

这里的头像img用的是Resource格式,因为我这里模拟演示的时候,用的是本地media文件夹里的图片,在实际项目中,也可以改成string,以对应网络url地址

第二步是模拟一组测试数据,我们在目录里创建一个data文件夹用来存放测试数据,然后创建一个_Chat.ets用来存放聊天的数据。因为是新的文件,所以在这个页面里,并没有对数据类型的定义,所以要先从刚才model文件那里把这个数据规范import过来,然后通过const创建一个数组,并通过as来确认这个数组里的每一个json数据都是同一个聊天数据的规范

代码如下:

```

import {Info} from '../model/_Chat'

export const Chatlist = [

{

name:"同学1",

img:$r("app.media.head1"),

day:"5月5日",

last:"今天上学怎么样?"

},

{

name:"同学2",

img:$r("app.media.head2"),

day:"5月5日",

last:"今天上学怎么样?"

}

] as Info[]

```

由于整体页面结构采用一个@Entry修改的页面+Tab来包裹的4个子组件的形式,因此继续在目录里创建一个views文件夹,用来存放表示一级页面的子组件,然后创建一个Home.ets作为首页

然后要通过import,来引入模拟数据和这个聊天的数据类型,代码如下

``` javascript

import {Chatlist} from '../data/_Chat'

import * as chat from '../model/_Chat'

```

然后创建一个@State描述的数据,作为数据列表

```

@State list:chat.Info[] = Chatlist;

```

最上面的首页标题,使用Row+Text来创建

```

Row() {

Text('首页')

.fontSize(20)

.fontWeight(FontWeight.Medium)

.fontColor('#333333')

}

.width('100%')

.height(56)

.justifyContent(FlexAlign.Center)

.backgroundColor('#f8f9fa')

.border({

width: { bottom: 1 },

color: '#e9ecef'

})

```

这里使用了justifyContent属性来进行居中,如果不加这个属性的话,那么100%宽度的row会让文字靠左显示。接下来是显示聊天数据的列表,这里采用ForEach列表渲染来实现。组件上的话,要考虑到多组数据的情况下是要上下滚动的,所以采用List+ListItem的组合比较合适,虽然说Scroll也能滚动,但是实际上我觉得套个List更加方便,我之前api6那会儿,写js开发鸿蒙的时候,也是用的这个方法。

然后页面中,最新的消息是给了一行的显示位置,然而实际上,很多情况下最新消息的字数可能会超过一行的限制,所以对于这个Text组件,要加上maxLines和textOverflow这两个属性,这两个属性表示最大行数和超出最大行数的话,内容如何显示,单独设置其中某一个是没有意义的。

这里的头像使用了圆形设计方案,当然这个头像的图片不可能直接上传成圆形的,这个是通过对于图片的borderRadius属性进行设置实现的,要把图片的宽度和高度设置成一样的数值,然后把borderRadius这个属性设置为高宽的一半

对于日期的设置上,可以看到日期是在每个组件的右上方的,但这不是通过position来固定的,而是和姓名在同一行里,然后通过设置这个row的justifyContent属性实现的,那么,这就要求,row的父组件的宽度,要正好是除了图片外的全部宽度,所以row的父组件即Column要加上layoutWeight属性,设置为1

这部分的代码如下:

```

List() {

ForEach(this.list, (item: chat.Info, index: number) => {

ListItem() {

Column() {

Row() {

// 头像

Image(item.img)

.width(50)

.height(50)

.borderRadius(25)

.margin({ right: 12 })

// 中间内容区域

Column() {

Row() {

// 姓名

Text(item.name)

.fontSize(16)

.fontWeight(FontWeight.Medium)

.fontColor('#1a1a1a')

// 日期

Text(item.day)

.fontSize(12)

.fontColor('#8e8e93')

}

.width('100%')

.justifyContent(FlexAlign.SpaceBetween)

.margin({ bottom: 4 })

// 最新消息

Text(item.last)

.fontSize(14)

.fontColor('#8e8e93')

.maxLines(1)

.textOverflow({ overflow: TextOverflow.Ellipsis })

.width('100%')

}

.layoutWeight(1)

.alignItems(HorizontalAlign.Start)

}

.width('100%')

.padding({ left: 16, right: 16, top: 12, bottom: 12 })

.alignItems(VerticalAlign.Center)

// 分割线

if (index < this.list.length - 1) {

Divider()

.strokeWidth(0.5)

.color('#e5e5e7')

.margin({ left: 78 })

}

}

}

.backgroundColor('#ffffff')

.onClick(() => {

// 跳转到聊天页面,传递姓名参数

router.pushUrl({

url: 'pages/Chat',

params: {

name: item.name

}

})

})

})

}

.layoutWeight(1)

.backgroundColor('#ffffff')

.scrollBar(BarState.Off)

.edgeEffect(EdgeEffect.Spring)

```

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...