鸿蒙NEXT开发-知乎评论小案例(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下

如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识

专栏地址: https://blog.csdn.net/qq_56760790/category_12794123.html

目录

1. 基本介绍

1.1 首页图

1.2 评论页图

 2. 分解组件

2.1 新增导航栏组件

2.2 新增首页内容组件

2.3 新增评论组件

2.4 新增评论回复组件

3. 新增实体类

3.1 内容实体类

3.2 回复实体类

4. 新增页面

4.1 详情页

4.1.1 代码如下

4.2 首页页面

4.2.1 代码如下

5. 学习地址

1. 基本介绍

知乎评论小案例一共包含两个页面,分别是首页和评论页面,首页包含了知乎人家发的内容信息,从内容点击进去就可以访问到对应内容的评论,用户可以发送评论

1.1 首页图

首页展示app里面的所有内容,内容里面包含了用户的头像、内容封面、内容、日期、IP等信息

1.2 评论页图

评论页面里面包含了当前内容的评论回复,评论数量、点赞数,发布评论功能

 2. 分解组件

2.1 新增导航栏组件

在编辑器里面新建一个文件目录叫components,然后新建NavBarComponent.ets文件

import { router } from '@kit.ArkUI'

@Preview
  @Component
  export default struct NavBarComponent {
    title: string = "标题"

    build() {
      Row() {
        // 返回键
        Row() {
          Image($r('app.media.back'))
            .width(16)
            .height(16)
        }
        .width(30)
          .height(30)
          .borderRadius(15)
          .backgroundColor("#f4f4f4")
          .justifyContent(FlexAlign.Center)
          .margin({
            left: 20
          })
          .onClick(() => {
            router.back()
          })

        Text(this.title)
          .layoutWeight(1)
          .textAlign(TextAlign.Center)
          .margin({
            right: 50
          })
      }
      .width('100%')
        .height(50)
        .border({
          color: "#f4f5f6",
          width: {
            bottom: 1
          }
        })
    }
  }

2.2 新增首页内容组件

在components文件目录下面新建一个ContentComponent.ets文件

import ContentModel from '../model/ContentModel'

@Preview
  @Component
  export default struct ContentComponent {
    @State item: ContentModel = new ContentModel(1,
                                                 'https://p6-passport.byteacctimg.com/img/user-avatar/d7ad5f39e86149d511489a5cdec341d5~100x100.awebp',
                                                 '东林知识库',
                                                 '本库是个人学习的时候记录的笔记 对 Java 的一些基础知识、数据库知识、以及框架知识进行收集、整理(持续更新中)',
                                                 $r('app.media.content'),
                                                 '10-30',
                                                 '合肥'
                                                )

    build() {
      Row({ space: 10 }) {
        Image(this.item.avatar)
          .width(40)
          .height(40)
          .borderRadius(20)

        Column({ space: 10 }) {
          Text(this.item.author)
            .fontColor("#303a43")
            .fontSize(18)
            .fontWeight(FontWeight.Bold)

          Text(this.item.content)
            .fontColor("#2f3642")
            .lineHeight(22)
          Row() {
            Text(`${this.item.time} .IP属地${this.item.area}`)
              .fontColor("#cacaca")
              .fontSize(12)

            Image(this.item.images)
              .width(80)
              .height(60)
          }
          .justifyContent(FlexAlign.SpaceBetween)
            .width('100%')
        }
        .alignItems(HorizontalAlign.Start)
          .layoutWeight(1)

      }
      .alignItems(VerticalAlign.Top)
        .padding(20)
        .width('100%')
    }
  }

2.3 新增评论组件

在components文件目录下面新建CommentItemComponent.ets文件

import ReplyItemModel from '../model/ReplyItemModel'

@Preview
  @Component
  export default struct CommentItemComponent {
    @State item: ReplyItemModel = new ReplyItemModel(1,
                                                     'https://picx.zhimg.com/027729d02bdf060e24973c3726fea9da_l.jpg?source=06d4cd63',
                                                     '小花',
                                                     '谁能爱我一次哈哈',
                                                     '11-30',
                                                     '海南',
                                                     34,
                                                     false
                                                    )

    build() {
      Row({ space: 10 }) {
        Image(this.item.avatar)
          .width(40)
          .height(40)
          .borderRadius(20)

        Column({ space: 10 }) {
          Text(this.item.author)
            .fontColor("#303a43")
            .fontSize(18)
            .fontWeight(FontWeight.Bold)

          Text(this.item.content)
            .fontColor("#2f3642")
            .lineHeight(22)
          Row() {
            Text(`${this.item.time} .IP属地${this.item.area}`)
              .fontColor("#cacaca")
              .fontSize(12)

            Row({ space: 4 }) {
              Image($r("app.media.like"))
                .width(40)
                .height(30)
                .fillColor("#cacaca")

              Text(this.item.likeNum.toString())
                .fontColor("#cacaca")
                .fontSize(12)

            }
          }
          .justifyContent(FlexAlign.SpaceBetween)
            .width('100%')
        }
        .alignItems(HorizontalAlign.Start)
          .layoutWeight(1)

      }
      .alignItems(VerticalAlign.Top)
        .padding(20)
        .width('100%')
    }
  }

2.4 新增评论回复组件

在components文件目录下面新建ReplyInputComponent.ets文件

import ReplyItemModel from '../model/ReplyItemModel'


@Component
  export default struct ReplyInputComponent {
    @Link contentList: ReplyItemModel[]
    @State content: string = ''

    build() {
      Row({ space: 10 }) {
        TextInput({ text: $$this.content, placeholder: '~请留下您的神评论' })
          .layoutWeight(1)
          .height(40)
        Button("发布")
          .onClick(() => {
            if (this.content) {
              this.contentList.push(new ReplyItemModel(Math.random(),
                                                       'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2F1bad8264-7428-44cf-a92d-3016a2de537b%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1711626934&t=5478cb3adef5d3e29e6952934797ca39',
                                                       '东林',
                                                       this.content,
                                                       '10-30',
                                                       '山东',
                                                       31,
                                                       false
                                                      ))
              this.content = ""
            }
          })
      }
      .padding({ left: 10, right: 10 })
        .width('100%')
        .height(60)
    }
  }

3. 新增实体类

3.1 内容实体类

在编辑器里面新建一个model文件目录,在这个文件目录下面新建ContentModel.ets文件

export default class ContentModel {
  id: number = 0
  avatar: string = ''
  author: string = ''
  content: string = ''
  images: string | Resource = ''
  time: string = ''
  area: string = ''

  constructor(id: number, avatar: string, author: string, content: string, images: string | Resource, time: string,
              area: string) {
    this.id = id
    this.avatar = avatar
    this.author = author
    this.content = content
    this.time = time
    this.area = area
    this.images = images
  }
}

3.2 回复实体类

在model文件目录下面新建ReplyItemModel.ets文件

export default class ReplyItemModel {
  id: number = 0
  avatar: string = ''
  author: string = ''
  content: string = ''
  time: string = ''
  area: string = ''
  likeNum: number = 0
  likeFlag: boolean = false

  constructor(id: number, avatar: string, author: string, content: string, time: string, area: string, likeNum: number,
              likeFlag: boolean) {
    this.id = id
    this.avatar = avatar
    this.author = author
    this.content = content
    this.time = time
    this.area = area
    this.likeNum = likeNum
    this.likeFlag = likeFlag
  }
}

4. 新增页面

4.1 详情页

在文件目录pages下面新建Detail.ets的页面,代码如下展示

4.1.1 代码如下

import NavBarComponent from '../components/NavBarComponent'
import CommentItemComponent from '../components/CommentItemComponent'
import ReplyItemModel from '../model/ReplyItemModel'
import ReplyInputComponent from '../components/ReplyInputComponent'

@Entry
  @Component
  struct Detail {

    @State commentList: ReplyItemModel[] = [
      new ReplyItemModel(1,
                         'https://picx.zhimg.com/027729d02bdf060e24973c3726fea9da_l.jpg?source=06d4cd63',
                         '小花',
                         '谁能爱我一次哈哈',
                         '11-30',
                         '海南',
                         34,
                         false
                        ),
      new ReplyItemModel(2,
                         'https://pic1.zhimg.com/v2-5a3f5190369ae59c12bee33abfe0c5cc_xl.jpg?source=32738c0c',
                         '东林',
                         '东林大王来了',
                         '11-30',
                         '北京',
                         100,
                         true
                        ),

      new ReplyItemModel(3,
                         'https://pic1.zhimg.com/v2-5a3f5190369ae59c12bee33abfe0c5cc_xl.jpg?source=32738c0c',
                         '小妹',
                         '今天吃香蕉',
                         '11-30',
                         '北京',
                         100,
                         true
                        ),
      new ReplyItemModel(4,
                         'https://pic1.zhimg.com/v2-5a3f5190369ae59c12bee33abfe0c5cc_xl.jpg?source=32738c0c',
                         '大王',
                         '我要好好学习报效国家',
                         '11-30',
                         '北京',
                         100,
                         true
                        ),
    ]

    build() {
      Column() {
        NavBarComponent({ title: '评论回复' })
        Divider().strokeWidth(6)
        Row() {
          Text("评论数50")
        }
        .width('100%')
          .height(50)
          .padding({
            left: 20
          })
          .border({
            color: '#f3f4f5',
            width: {
              bottom: 1
            }
          })

        List() {
          ForEach(this.commentList, (item: ReplyItemModel) => {
            ListItem() {
              CommentItemComponent({ item })
            }
          }, (item: ReplyItemModel) => item.id.toString())
        }.layoutWeight(1)

        ReplyInputComponent({ contentList: this.commentList })

      }
    }
  }

4.2 首页页面

在文件目录pages下面修改Index.ets页面,代码如下

4.2.1 代码如下

import ContentComponent from '../components/ContentComponent'
import ContentModel from '../model/ContentModel'
import { router } from '@kit.ArkUI'

@Entry
  @Component
  struct Index {
    @State content: ContentModel = new ContentModel(1,
                                                    'https://p6-passport.byteacctimg.com/img/user-avatar/d7ad5f39e86149d511489a5cdec341d5~100x100.awebp',
                                                    '东林知识库',
                                                    '本库是个人学习的时候记录的笔记 对 Java 的一些基础知识、数据库知识、以及框架知识进行收集、整理(持续更新中)',
                                                    'https://p6-passport.byteacctimg.com/img/user-avatar/d7ad5f39e86149d511489a5cdec341d5~100x100.awebp',
                                                    '10-30',
                                                    '合肥',
                                                   )

    build() {
      Column() {
        Text('我是知乎首页')
        List() {
          ForEach([1, 2, 3, 4, 5, 6, 7], () => {
            ListItem() {
              ContentComponent({ item: this.content })
                .onClick(() => {
                  router.pushUrl({
                    url: 'pages/Detail'
                  })
                })
            }
          })

        }

      }
      .justifyContent(FlexAlign.Start)
        .width('100%')
        .height('100%')

    }
  }

5. 学习地址

全网首发鸿蒙NEXT星河版零基础入门到实战,2024年最新版,企业级开发!视频陆续更新中!_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盘点超好用的 Windows 录屏软件,轻松记录屏幕精彩

在当今数字化信息高速流转的时代,屏幕录制已经成为我们日常工作、学习和娱乐中不可或缺的一项技能。如果你是微软电脑,正好我今天想要介绍的就是windows怎么录屏相关工具的操作,感兴趣就继续往下看吧。 1.FOXIT录屏大师 链接直达&#xff1…

鸿蒙开发实战项目【硅谷租房】--- 项目介绍

目录 一、简述 二、项目资料 2.1 UI设计稿 2.2 服务器 2.3 Apifox接口JSON文件 使用 Apifox 测试接口 一、简述 这是一个基于 鸿蒙 API12 开发的移动端租房 App,用户可以使用该应用搜索租房列表、查看房屋详情、预约租房等。 该项目的tabbar包含五部分&…

Ubuntu系统下的用户管理

Ubuntu系统下的用户管理 一、ubuntu介绍1.1 ubuntu简介1.2 主要特点 二、创建新用户2.1 查看当前Ubuntu版本2.2 创建新用户2.3 修改密码2.4 查看用户id 三、新建用户组3.1 新建用户组3.2 查询用户组3.3 加入某个用户组 四、赋予sudo权限4.1 将用户添加到 sudo 组4.2 查看admin用…

NFTScan | 10.07~10.13 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2024.10.07~ 2024.10.13 NFT Hot News ​01/ 数据:9 月份加密市场大多数指标均出现下降,链上总交易量下降 13% 10 月 7 日,据 The Block 研究总监 la…

【C#网络编程】基础概念2

文章目录 网络、数据包和协议网络数据包协议TCP、UDP 地址客户端和服务器套接字 网络、数据包和协议 计算机网络通过通信通道互连的机器组成,通常把这些机器称为主机和路由器,主机是是运行应用程序(如 Web 浏览器)的计算机。路由器…

同三维T80001HK4 四路4K30HDMI H.264编码器

4路同时编码,带4路3.5外置音频 同三维T80001HK4四路4K30HDMI H.264编码器 同三维T80001HK4用于高清视频信号(4K30Hz)编码及网络传输的硬件设备,采用最新高效H.264高清数字视频压缩技术,具备稳定可靠、高清晰度、低码率…

CyberRt实践之Hello Apollo(Apollo 9.0版本)

apollo9.0环境安装参考官方网站 apollo.baidu.com/community/Apollo-Homepage-Document?docBYFxAcGcC4HpYIbgPYBtXIHQCMEEsATAV0wGNkBbWA5UyRFdZWVBEAU0hFgoIH0adPgCY%2BADwCiAVnEAhAILiAnABZxEgOzK1Y%2BQA51M3ROUnJBsbK2WZoyUdkBhcXoAMhlwDFlARnUXZdzE9AGY%2BbFINADYpUhCEFW…

JavaEE 多线程第二节 (多线程的简单实现Thread/Runable)

1. 创建线程(继承 Thread 类)步骤: 继承 Thread 类: 创建一个类并继承 Thread 类,然后重写 run() 方法,在该方法中写入线程执行的代码 class MyThread extends Thread {Overridepublic void run()…

SpringBoot 之 配置 RestTemplate + 跳过https 验证

上截图 目录文件结构 在配置文件下创建下面两个文件 文件内容 HttpsClientHttpRequestFactory.java package org.fri.config;import org.apache.http.ssl.SSLContexts; import org.apache.http.ssl.TrustStrategy; import org.springframework.context.annotation.Configur…

重学SpringBoot3-安装Spring Boot CLI

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-安装Spring Boot CLI 1. 什么是 Spring Boot CLI?2. Spring Boot CLI 的安装2.1. 通过 SDKMAN! 安装2.2. 通过 Homebrew 安装(适…

SpringCloud-OpenFeign-服务接口调用

是什么 把需要暴露的api使用接口来暴露,客户端需要调用的时候,直接查看这个接口中有没有就可以了 通用步骤 架构说明 common模块 common 引入 openfeign 新建服务接口类 FeignClient(value "cloud-payment-service") // 服务名 public i…

【C语言】动态内存管理及相关笔试题

文章目录 一、为什么有动态内存分配二、malloc和free1.malloc函数的使用2.free函数的使用 三、calloc和realloc1.calloc函数的使用2.realloc函数的使用 四、常见动态内存分配的错误五、动态内存经典笔试题题1题2题3 六、总结C/C中程序内存区域划分 一、为什么有动态内存分配 我…

SpringBoot基础(四):bean的多种加载方式

SpringBoot基础系列文章 SpringBoot基础(一):快速入门 SpringBoot基础(二):配置文件详解 SpringBoot基础(三):Logback日志 SpringBoot基础(四):bean的多种加载方式 目录 一、xml配置文件二、注解定义bean1、使用AnnotationCon…

SCRM呼叫中心高保真Axure原型 源文件分享

在数字化时代,客户关系管理(CRM)对于企业的成功至关重要。SCRM呼叫中心后台作为一款专为CRM设计的软件原型,致力于为企业提供高效、智能的客户沟通解决方案。本文将详细介绍该产品的核心功能及其对企业提升客户满意度和销售业绩的…

C++,STL 030(24.10.14)

stack容器(栈)的基本概念: 1.stack容器是一种先进后出的数据结构,它只有一个出口。 2.图例: 注意: (1)进栈顺序:a1 -> a2 -> a3 -> a4 -> a5 (2)出栈顺序:a5 -> …

机器学习-决策树详解

决策树 决策树简介 学习目标 1.理解决策树算法的基本思想 2.知道构建决策树的步骤 【理解】决策树例子 决策树算法是一种监督学习算法,英文是Decision tree。 决策树思想的来源非常朴素,试想每个人的大脑都有类似于if-else这样的逻辑判断&#xff…

12.1-基础柱状图构建

Python基础综合案例——数据可视化 动态柱状图 通过Bar构建基础柱状图 反转x和y轴 调用 bar.reversal_axis() 我们现在所看到的数值是从下到上的,当我们反转之后数据是从左向右的,我们现在把数据放到柱的右边。即数值标签在右侧 添加y轴数据的时候&am…

oceanbase的日志量太大,撑爆磁盘,修改下日志级别

oceanbase的日志量太大,撑爆磁盘,修改下日志级别: [adminlnpg ~]$ obclient -h127.0.0.1 -uroot -P2881 -plinux123 Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 3221561020 Server version: O…

Android基于gradle task检查各个module之间资源文件冲突情况

做组件化开发的时候,我们经常会遇到各个不同的module之间资源文件冲突的问题,运行也不报错,但是会出现覆盖的问题,导致运行之后发送错误的效果。 所以我们需要利用一个gradlke 脚本task,来自动化检查资源文件冲突。 …

CST学习笔记(二)Floquet模式激励设置

CST学习笔记(二)Floquet模式激励设置 在CST中我们常常使用Floquet模式来仿真频率选择表面(FSS)或者超材料等,但是我们设置好Zmax的floquet模式数量后,启动仿真,会发现S参数一栏中有很多我们不想要看的S参数&#xff0…