鸿蒙HarmonyOS评论功能小demo
评论页面小demo
效果展示

1.拆解组件,分层搭建
我们将整个评论页面拆解为三个组件,分别是头部导航,评论项,回复三个部分,然后统一在index界面导入

2.头部导航界面搭建

@Preview
@Component
struct HmNavBar {// 属性:是可以被传递值进行替换的build() {Stack({ alignContent: Alignment.Start }) {Row() {Image($r('sys.media.ohos_ic_compnent_titlebar_back')).width('100%').aspectRatio(1)}.width(24).padding(4).borderRadius(12).backgroundColor('#f5f7f8')Text('评论回复')//先设置占页面的100% 然后在居中对齐.width('100%').textAlign(TextAlign.Center)}.width('100%').padding(20)}
}export { HmNavBar }
- 上述UI界面搭建很简单,但要注意一点就是在有了返回按钮的情况下如何让评论回复在整行居中,我们可以采用Stack布局,或者是在右边也放置一个宽度为24的容器
3.评论项搭建

@Preview
@Component
struct HmReplay {build() {Row({ space: 8 }) {Image($r('app.media.Cover1')).width(60).borderRadius(30)Column({ space: 5 }) {Text('遇到困难睡大觉').fontSize(18).fontWeight(700)Text('你已经是一个成熟的评论了要学会自己打破零回复!').fontSize(18)Row() {Row() {Text('10-21.IP 属地安徽').fontColor('#ffcfcfcf')}Row({ space: 5 }) {Image($r('app.media.love')).width(24).aspectRatio(1)Text('100').fontColor('#ffcfcfcf')}}.width('100%').justifyContent(FlexAlign.SpaceBetween)}.layoutWeight(1).alignItems(HorizontalAlign.Start)}.width('100%').padding(20).height(120).alignItems(VerticalAlign.Top)}
}export { HmReplay }
4.评论列表搭建
4.1.1分割线+回复 部分
Row() {Text('回复 (7)')}.padding(12).border({width: {top: 6},color: 'rgb(246,246,246)'}).width('100%')
4.1.2 评论列表
1.导入对应的数据结构
@State commentList: ReplyItemModel[] = [new ReplyItemModel({id: 1,avatar: 'https://picx.zhimg.com/027729d02bdf060e24973c3726fea9da_l.jpg?source=06d4cd63',author: '偏执狂-妄想家',content: '更何况还分到一个摩洛哥[惊喜]',time: '11-30',area: '海南',likeNum: 34,likeFlag: false}),new ReplyItemModel({id: 2,avatar: 'https://pic1.zhimg.com/v2-5a3f5190369ae59c12bee33abfe0c5cc_xl.jpg?source=32738c0c',author: 'William',content: '当年希腊可是把1:0发挥到极致了',time: '11-29',area: '北京',likeNum: 58,likeFlag: false}),new ReplyItemModel({id: 3,avatar: 'https://picx.zhimg.com/v2-e6f4605c16e4378572a96dad7eaaf2b0_l.jpg?source=06d4cd63',author: 'Andy Garcia',content: '欧洲杯其实16队球队打正赛已经差不多,24队打正赛意味着正赛阶段在小组赛一样有弱队。',time: '11-28',area: '上海',likeNum: 10,likeFlag: false}),new ReplyItemModel({id: 4,avatar: 'https://picx.zhimg.com/v2-53e7cf84228e26f419d924c2bf8d5d70_l.jpg?source=06d4cd63',author: '正宗好鱼头',content: '确实眼红啊,亚洲就没这种球队,让中国队刷',time: '11-27',area: '香港',likeNum: 139,likeFlag: false}),new ReplyItemModel({id: 5,avatar: 'https://pic1.zhimg.com/v2-eeddfaae049df2a407ff37540894c8ce_l.jpg?source=06d4cd63',author: '柱子哥',content: '我是支持扩大的,亚洲杯欧洲杯扩到32队,世界杯扩到64队才是好的,世界上有超过200支队伍,欧洲区55支队伍,亚洲区47支队伍,即使如此也就六成出现率',time: '11-27',area: '旧金山',likeNum: 29,likeFlag: false}),new ReplyItemModel({id: 6,avatar: 'https://picx.zhimg.com/v2-fab3da929232ae911e92bf8137d11f3a_l.jpg?source=06d4cd63',author: '飞轩逸',content: '禁止欧洲杯扩军之前,应该先禁止世界杯扩军,或者至少把亚洲名额一半给欧洲。',time: '11-26',area: '里约',likeNum: 100,likeFlag: false})]
//先定义一个接口 然后可以使用接口转换工具转换成对应的类
export interface ReplyItem {avatar: ResourceStr // 头像author: string // 作者id: number // 评论的idcontent: string // 评论内容time: string // 发表时间area: string // 地区likeNum: number // 点赞数量likeFlag: boolean | null // 当前用户是否点过赞
}export class ReplyItemModel implements ReplyItem {avatar: ResourceStr = ''author: string = ''id: number = 0content: string = ''time: string = ''area: string = ''likeNum: number = 0likeFlag: boolean | null = nullconstructor(model: ReplyItem) {this.avatar = model.avatarthis.author = model.authorthis.id = model.idthis.content = model.contentthis.time = model.timethis.area = model.areathis.likeNum = model.likeNumthis.likeFlag = model.likeFlag}
}
4.搭建评论列表界面
List() {ForEach(this.commentList, (item: ReplyItemModel) => {ListItem() {HmCommentItem({commentInfo: item,//但凡传函数吧必须用箭头函数包裹!changeLike:(id:number)=>{this.changeLike(id)}})}})}.layoutWeight(1)
- 这里需要注意几点
- List里面必须放置
ListItem() - 评论列表的高度可以给一个自适应,这样可以让列列表超出屏幕的高度时实现自适应
5.点赞逻辑的实现
实现任务:当我们点击爱心或者点赞的时候,点赞数量+1,爱心变位红色,当我们再次点击,点赞由原来的点赞变为取消点赞,爱心的颜色变为灰色,点赞的数量-1
代码层面分析:由于我们显示的数据是由主界面传到子界面的,所以我们需要在父界面定义一个方法,传递到子面去,在子界面去调用这个方法,所以在子界面需要有一个接受的方法
5.1.1 子界面接收的方法
changeLike:(id:number)=>void = ()=> {}
5.1.2 点赞业务逻辑的实现
//点赞逻辑处理changeLike(id:number){//遍历数组 对commentlist数组中的每一个元素item进行迭代const index = this.commentList.findIndex(item =>item.id === id)//分支处理主评论和回复评论点赞状态if(index < 0){//处理主评论if(this.comment.likeFlag){//已经点赞this.comment.likeNum -- //点赞数量--}else {//未点赞//点赞数量++this.comment.likeNum++}this.comment.likeFlag = !this.comment.likeFlag}else{//处理回复评论 找到回复列表中的某一个子评论//返回第一次匹配元素的数组索引(0~N)if(this.commentList[index].likeFlag){this.commentList[index].likeNum--}else {this.commentList[index].likeNum++}this.commentList[index].likeFlag = !this.commentList[index].likeFlag//@State修饰的数据只能监听到第一层或者本身 需要new一下在使用this.commentList[index] = new ReplyItemModel(this.commentList[index])// this.commentList.splice(index,1,this.commentList[index])}
5.1.3父界面进行传值

6.发布界面的搭建
6.1.1 发布的逻辑
publishComment(content:string){this.commentList.unshift(new ReplyItemModel({// id: Math.random()的作用是生成一个基于随机数的临时唯一标识,但需注意:// 数值范围: 0 ≤ N < 1 (浮点数)// 格式示例: 0.1234567890123456// 非整型: 生成16位小数的浮点数//id不能重复id: Math.random(),avatar: 'https://picx.zhimg.com/027729d02bdf060e24973c3726fea9da_l.jpg?source=06d4cd63',author: '遇到困难睡大觉',content: '山外青山楼外楼,不回消息我记仇',time: '11-30',area: '安徽',likeNum: 0,likeFlag: false}))}
6.1.2 发布界面
@Preview
@Component
struct replay {content: string = ''@Linkconmentsnum: numberpublish: (content: string) => void = () => {}build() {Row() {TextInput({ placeholder: '请留下你的评论~', text: $$this.content }).layoutWeight(1).onSubmit(() => {this.publish(this.content)this.content = ''})Button('发布').onClick(() => {this.publish(this.content)this.content = ''this.conmentsnum++})}.width('100%').padding(12)}
}export { replay }
相关文章:
鸿蒙HarmonyOS评论功能小demo
评论页面小demo 效果展示 1.拆解组件,分层搭建 我们将整个评论页面拆解为三个组件,分别是头部导航,评论项,回复三个部分,然后统一在index界面导入 2.头部导航界面搭建 Preview Component struct HmNavBar {// 属性&a…...
基于PyTorch的深度学习3——基于autograd的反向传播
反向传播,可以理解为函数关系的反向传播。...
日期格式与字符串不匹配bug
异常特征:java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String ### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.Str…...
打印三角形及Debug
打印三角形及Debug package struct; public class TestDemo01 {public static void main(String[] args) {//打印三角形 五行 for (int i 1; i < 5; i) {for (int j 5 ; j >i; j--) {System.out.print(" ");}for (int k1;k<i;k) {System.out.print(&…...
大语言模型揭秘:从诞生到智能
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)无疑是技术领域最耀眼的明星之一。它们不仅能够理解人类的自然语言,还能生成流畅的文本,甚至在对话、翻译、创作等任务中表现出接近人类的智能…...
Collab-Overcooked:专注于多智能体协作的语言模型基准测试平台
2025-02-27,由北京邮电大学和理想汽车公司联合创建。该平台基于《Overcooked-AI》游戏环境,设计了更具挑战性和实用性的交互任务,目的通过自然语言沟通促进多智能体协作。 一、研究背景 近年来,基于大型语言模型的智能体系统在复…...
SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试(WebSocket连接模式)
文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 WebsocketConfig.java2.7 AiChatWebSocketHandler.java2.8 SaveChatSessionParamRequest.java2.9 index.html 三、页面调试3.1 主页…...
LINUX网络基础 [一] - 初识网络,理解网络协议
目录 前言 一. 计算机网络背景 1.1 发展历程 1.1.1 独立模式 1.1.2 网络互联 1.1.3 局域网LAN 1.1.4 广域网WAN 1.2 总结 二. "协议" 2.1 什么是协议 2.2 网络协议的理解 2.3 网络协议的分层结构 三. OSI七层模型(理论标准) …...
由麻省理工学院计算机科学与人工智能实验室等机构创建低成本、高效率的物理驱动数据生成框架,助力接触丰富的机器人操作任务
2025-02-28,由麻省理工学院计算机科学与人工智能实验室(CSAIL)和机器人与人工智能研究所的研究团队创建了一种低成本的数据生成框架,通过结合物理模拟、人类演示和基于模型的规划,高效生成大规模、高质量的接触丰富型机…...
【RAG从入门到精通系列】【RAG From Scratch 系列教程2:Query Transformations】
目录 前言一、概述1-1、RAG概念1-2、前置知识1-2-1、ModelScopeEmbeddings 词嵌入模型1-2-2、FAISS介绍&安装 (向量相似性搜索)1-2-3、Tiktoken 分词工具 二、Rag From Scratch:Query Transformations2-1、前置环境安装2-2、多查询检索器2-2-1、加载网页内容2-2…...
通过RK3588的cc-linaro-7.5.0交叉编译器搭建QT交叉编译环境QtCreator(无需编译QT源码)
当我们需要给新的电脑上部署RK3588的QT交叉编译环境时,我们可以将旧电脑上的编译好的qmake直接拷贝到新电脑上并配置好环境。 一、开发环境 1、ubuntu20.04 2、qt5.14.2 3、交叉编译器gcc-linaro-7.5.0 4、已编译好的qt交叉编译器 二、资料下载 链接: https:…...
前端基础之消息订阅与发布
需要下载npm I pubsub-js 在Student.vue中发送数据 <template> <div class"demo"> <h2 class"title">学生姓名:{{name}}</h2> <h2>学生性别:{{sex}}</h2> <button click"sendStudentName">将学生名给…...
51c自动驾驶~合集53
我自己的原文哦~ https://blog.51cto.com/whaosoft/13431196 #DriveTransformer 上交提出:以Decoder为核心的大一统架构写在前面 & 笔者的个人理解 当前端到端自动驾驶架构的串行设计导致训练稳定性问题,而且高度依赖于BEV,严重限…...
CS144 Lab Checkpoint 0: networking warm up
Set up GNU/Linux on your computer 我用的是Ubuntu,按照指导书上写的输入如下命令安装所需的软件包: sudo apt update && sudo apt install git cmake gdb build-essential clang \ clang-tidy clang-format gcc-doc pkg-config glibc-doc tc…...
Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项
以下是修改后的完整文档,包含在多个多线程环境中使用 retain() 和 release() 方法的示例,且确保在 finally 块中调用 release(): 在 Spring WebFlux 中,WebSocketMessage 主要用于表示 WebSocket 的消息载体,其中 getP…...
Android ChatOn-v1.66.536-598-[构建于ChatGPT和GPT-4o之上]
ChatOn 链接:https://pan.xunlei.com/s/VOKYnq-i3C83CK-HJ1gfLf4gA1?pwdwzwc# 添加了最大无限积分 删除了所有调试信息 语言:全语言支持...
游戏树搜索与优化策略:Alpha-Beta剪枝及其实例分析
1.Alpha-Beta搜索 Alpha-Beta 搜索是一种用于对抗性游戏(比如象棋、围棋)的智能算法,目的是帮助计算机快速找到“最优走法”,同时避免不必要的计算。它的核心思想是:通过剪掉明显糟糕的分支,大幅减少需要计…...
基于Qwen-VL的手机智能体开发
先上Demo: vl_agent_demo 代码如下: 0 设置工作目录: 你的工作目录需要如下: 其中utils文件夹和qwenvl_agent.py均参考自 GitHub - QwenLM/Qwen2.5-VL: Qwen2.5-VL is the multimodal large language model series developed by …...
记录一次Spring事务失效导致的生产问题
一、背景介绍 公司做的是“聚合支付”业务,对接了微信、和包、数字人民币等等多家支付机构,我们提供统一的支付、退款、自动扣款签约、解约等能力给全国的省公司、机构、商户等。 同时,需要做对账功能,即支付机构将对账文件给到…...
深度学习实战:用TensorFlow构建高效CNN的完整指南
一、为什么每个开发者都要掌握CNN? 在自动驾驶汽车识别路标的0.1秒里,在医疗AI诊断肺部CT片的精准分析中,甚至在手机相册自动分类宠物的日常场景里,卷积神经网络(CNN)正悄然改变着我们的世界。本文将以工业…...
算法 之 贪心思维训练!
文章目录 从最大/最小开始贪心2279.装满石头的背包的最大数量2971.找到最大周长的多边形 从最左、最右开始贪心2712.使所有字符相等的最小成本 划分型贪心1221.分割平衡字符串 贪心策略在处理一些题目的时候能够带来意想不到的效果 从最小/最大开始贪心,优先考虑最小…...
从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(1)视频信息的获取与转发
文章大纲 基于YOLO的动作序列检查系统架构设计系统架构图实时视频传输协议技术对比视频流 常见协议对比表三、WebSocket内网传输设计方案四、样例程序(Python + JavaScript)五、性能优化建议新兴技术预警参考文献提示词参考基于YOLO的动作序列检查系统架构设计 系统架构图 #…...
大语言模型学习--LangChain
LangChain基本概念 ReAct学习资料 https://zhuanlan.zhihu.com/p/660951271 LangChain官网地址 Introduction | 🦜️🔗 LangChain LangChain是一个基于语言模型开发应用程序的框架。它可以实现以下应用程序: 数据感知:将语言模型…...
【PCIe 总线及设备入门学习专栏 4.5 -- PCIe 中断 MSI 与 MSI-X 机制介绍】
文章目录 PCI 设备中断机制PCIe 设备中断机制PCIe MSI 中断机制MSI CapabilityMSI-X 中断机制MSI-X capabilityMSI-X TablePBAMSI-X capability 解析MSI/MSI-X 操作流程扫描设备配置设备MSI 配置MSI-X 配置中断触发与处理PCI 设备中断机制 以前的PCI 设备是支持 物理上的 INTA…...
wxWidgets GUI 跨平台 入门学习笔记
准备 参考 https://wiki.wxwidgets.org/Microsoft_Visual_C_NuGethttps://wiki.wxwidgets.org/Tools#Rapid_Application_Development_.2F_GUI_Buildershttps://docs.wxwidgets.org/3.2/https://docs.wxwidgets.org/latest/overview_helloworld.htmlhttps://wizardforcel.gitb…...
valgrind 检测多线程 bug,检测 并发 bug concurrent bug parallel bug
valgrind --toolhelgrind ./your_program 如果检测的对象是大型程序,可以设定仅在某些函数中开启 valgrind 的检测: Valgrind 提供了一些客户请求(client requests),可以在代码中插入特定的宏来控制 Valgrind 的行为。…...
OpenMCU(一):STM32F407 FreeRTOS移植
概述 本文主要描述了STM32F407移植FreeRTOS的简要步骤。移植描述过程中,忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程,该工程已经下载放好了移植stm32f407 FreeRTOS的所有文件 OpenMCU_FreeRTOS工…...
割平面法的理解
割平面法的理解 1. 简介 割平面法(Cutting Plane Method)用于求解整数规划问题,通过逐步添加线性约束(割平面)逼近整数解。本文以Gomory割平面法为例,结合简单示例拆解核心步骤。 2. 示例详解 问题描述 …...
[自动驾驶-传感器融合] 多激光雷达的外参标定
文章目录 引言外参标定原理ICP匹配示例参考文献 引言 多激光雷达系统通常用于自动驾驶或机器人,每个雷达的位置和姿态不同,需要将它们的数据统一到同一个坐标系下。多激光雷达外参标定的核心目标是通过计算不同雷达坐标系之间的刚性变换关系(…...
C++ 学习(八)(模板,可变参数模板,模板专业化(完整模板专业化,部分模板专业化),类型 Traits,SFINAE(替换失败不是错误),)
C 模板 C 中的模板是一项强大的功能,允许您编写通用代码,这意味着您可以编写可以处理不同数据类型的单个函数或类。这意味着您无需为要使用的每种数据类型编写单独的函数或类。 模板函数 要创建模板函数,请使用 关键字,后跟类型…...
