鸿蒙HarmonyOS评论功能小demo

news2025/3/6 12:15:16

评论页面小demo

效果展示

img

1.拆解组件,分层搭建

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

image-20250304150652225

2.头部导航界面搭建

image-20250304151026576

@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.评论项搭建

image-20250304151409576

@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 // 评论的id
  content: string // 评论内容
  time: string // 发表时间
  area: string // 地区
  likeNum: number // 点赞数量
  likeFlag: boolean | null // 当前用户是否点过赞
}

export class ReplyItemModel implements ReplyItem {
  avatar: ResourceStr = ''
  author: string = ''
  id: number = 0
  content: string = ''
  time: string = ''
  area: string = ''
  likeNum: number = 0
  likeFlag: boolean | null = null

  constructor(model: ReplyItem) {
    this.avatar = model.avatar
    this.author = model.author
    this.id = model.id
    this.content = model.content
    this.time = model.time
    this.area = model.area
    this.likeNum = model.likeNum
    this.likeFlag = model.likeFlag
  }
}

4.搭建评论列表界面
      List() {
        ForEach(this.commentList, (item: ReplyItemModel) => {
          ListItem() {
            HmCommentItem({
              commentInfo: item,
              //但凡传函数吧必须用箭头函数包裹!
              changeLike:(id:number)=>{
                this.changeLike(id)
              }
            })
          }

        })
      }.layoutWeight(1)
  • 这里需要注意几点
  1. List里面必须放置ListItem()
  2. 评论列表的高度可以给一个自适应,这样可以让列列表超出屏幕的高度时实现自适应

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父界面进行传值

image-20250304214822497

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 = ''
  @Link
  conmentsnum: number
  publish: (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 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于PyTorch的深度学习3——基于autograd的反向传播

反向传播&#xff0c;可以理解为函数关系的反向传播。

打印三角形及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(&…

大语言模型揭秘:从诞生到智能

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;无疑是技术领域最耀眼的明星之一。它们不仅能够理解人类的自然语言&#xff0c;还能生成流畅的文本&#xff0c;甚至在对话、翻译、创作等任务中表现出接近人类的智能…

Collab-Overcooked:专注于多智能体协作的语言模型基准测试平台

2025-02-27&#xff0c;由北京邮电大学和理想汽车公司联合创建。该平台基于《Overcooked-AI》游戏环境&#xff0c;设计了更具挑战性和实用性的交互任务&#xff0c;目的通过自然语言沟通促进多智能体协作。 一、研究背景 近年来&#xff0c;基于大型语言模型的智能体系统在复…

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七层模型&#xff08;理论标准&#xff09; …

由麻省理工学院计算机科学与人工智能实验室等机构创建低成本、高效率的物理驱动数据生成框架,助力接触丰富的机器人操作任务

2025-02-28&#xff0c;由麻省理工学院计算机科学与人工智能实验室&#xff08;CSAIL&#xff09;和机器人与人工智能研究所的研究团队创建了一种低成本的数据生成框架&#xff0c;通过结合物理模拟、人类演示和基于模型的规划&#xff0c;高效生成大规模、高质量的接触丰富型机…

【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&#xff1a;Query Transformations2-1、前置环境安装2-2、多查询检索器2-2-1、加载网页内容2-2…

通过RK3588的cc-linaro-7.5.0交叉编译器搭建QT交叉编译环境QtCreator(无需编译QT源码)

当我们需要给新的电脑上部署RK3588的QT交叉编译环境时&#xff0c;我们可以将旧电脑上的编译好的qmake直接拷贝到新电脑上并配置好环境。 一、开发环境 1、ubuntu20.04 2、qt5.14.2 3、交叉编译器gcc-linaro-7.5.0 4、已编译好的qt交叉编译器 二、资料下载 链接: https:…

51c自动驾驶~合集53

我自己的原文哦~ https://blog.51cto.com/whaosoft/13431196 #DriveTransformer 上交提出&#xff1a;以Decoder为核心的大一统架构写在前面 & 笔者的个人理解 当前端到端自动驾驶架构的串行设计导致训练稳定性问题&#xff0c;而且高度依赖于BEV&#xff0c;严重限…

CS144 Lab Checkpoint 0: networking warm up

Set up GNU/Linux on your computer 我用的是Ubuntu&#xff0c;按照指导书上写的输入如下命令安装所需的软件包&#xff1a; sudo apt update && sudo apt install git cmake gdb build-essential clang \ clang-tidy clang-format gcc-doc pkg-config glibc-doc tc…

Android ChatOn-v1.66.536-598-[构建于ChatGPT和GPT-4o之上]

ChatOn 链接&#xff1a;https://pan.xunlei.com/s/VOKYnq-i3C83CK-HJ1gfLf4gA1?pwdwzwc# 添加了最大无限积分 删除了所有调试信息 语言&#xff1a;全语言支持

游戏树搜索与优化策略:Alpha-Beta剪枝及其实例分析

1.Alpha-Beta搜索 Alpha-Beta 搜索是一种用于对抗性游戏&#xff08;比如象棋、围棋&#xff09;的智能算法&#xff0c;目的是帮助计算机快速找到“最优走法”&#xff0c;同时避免不必要的计算。它的核心思想是&#xff1a;通过剪掉明显糟糕的分支&#xff0c;大幅减少需要计…

基于Qwen-VL的手机智能体开发

先上Demo&#xff1a; vl_agent_demo 代码如下&#xff1a; 0 设置工作目录&#xff1a; 你的工作目录需要如下&#xff1a; 其中utils文件夹和qwenvl_agent.py均参考自 GitHub - QwenLM/Qwen2.5-VL: Qwen2.5-VL is the multimodal large language model series developed by …

记录一次Spring事务失效导致的生产问题

一、背景介绍 公司做的是“聚合支付”业务&#xff0c;对接了微信、和包、数字人民币等等多家支付机构&#xff0c;我们提供统一的支付、退款、自动扣款签约、解约等能力给全国的省公司、机构、商户等。 同时&#xff0c;需要做对账功能&#xff0c;即支付机构将对账文件给到…

算法 之 贪心思维训练!

文章目录 从最大/最小开始贪心2279.装满石头的背包的最大数量2971.找到最大周长的多边形 从最左、最右开始贪心2712.使所有字符相等的最小成本 划分型贪心1221.分割平衡字符串 贪心策略在处理一些题目的时候能够带来意想不到的效果 从最小/最大开始贪心&#xff0c;优先考虑最小…

大语言模型学习--LangChain

LangChain基本概念 ReAct学习资料 https://zhuanlan.zhihu.com/p/660951271 LangChain官网地址 Introduction | &#x1f99c;️&#x1f517; LangChain LangChain是一个基于语言模型开发应用程序的框架。它可以实现以下应用程序&#xff1a; 数据感知&#xff1a;将语言模型…

【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…

OpenMCU(一):STM32F407 FreeRTOS移植

概述 本文主要描述了STM32F407移植FreeRTOS的简要步骤。移植描述过程中&#xff0c;忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程&#xff0c;该工程已经下载放好了移植stm32f407 FreeRTOS的所有文件 OpenMCU_FreeRTOS工…