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

news2024/11/25 20:22:45

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙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

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

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

相关文章

vue实现列表自动滚动(纯与原生方式)

Vue实现列表自动滚动(纯与原生方式) 源码放在最后!1.效果展示: 2.功能说明: 该滚动可能存在的Bug: 1.如果你写的大屏不是使用的接口轮询的方式可能会存在也页面空白的情况(需要手动刷新才能触发列表滚动),因为我使用的是监听数据的变化然后…

软件供应链十年:探索开源的增长、风险和未来

回顾软件供应链状况报告的 10 年既是一个里程碑,也是一次行动号召。在过去十年中,开源消费改变了软件开发的世界。我们看到了前所未有的创新,但也出现了新的挑战,特别是在管理软件供应链的安全性和完整性方面。 在 Sonatype&…

基于SpringBoot民宿预订系统小程序【附源码】

效果如下: 管理员登录界面 管理员功能界面 用户管理界面 房东管理界面 小程序首页界面 民宿房间界面 功能界面 研究背景 随着旅游业的蓬勃发展和人们对旅行体验的不断追求,民宿作为一种独特的住宿方式,因其个性化、温馨及富含地方特色的服务…

disabled状态el-form下el-button的disabled的精细化控制

有一个很复杂的表单,支持编辑和查看两种模式。 查看时当然不希望编辑,最好是区分模式,在编辑模式下直接用div显示而不是用表单元素。这样工作量就有点大。那就考虑使用表单元素的disabled来让其不能编辑。如果每个表单元素都写这个玩意也是…

ssm职业高中学情成绩系统设计+jsp

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 摘 要 I Abstract II 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 研究内容 2 第二章 开发环…

codeforces round976 div2

A find minimum operations 思路&#xff1a;将所给的n变成k进制数&#xff0c;答案就是n的k进制形式下的位数之和 代码&#xff1a; #include <bits/stdc.h> using namespace std;typedef long long ll;ll n, k;void solve() {cin >> n >> k;ll cnt 0…

详解Spotbugs-maven-plugin(报告如何生成html测试报告)

Spotbugs介绍 SpotBugs是Findbugs的继任者&#xff08;Findbugs已经不再维护&#xff09;&#xff0c;用于对Java代码进行静态分析&#xff0c;查找相关的漏洞&#xff0c;SpotBugs比Findbugs拥有更多的校验规则。静态分析会检查Java字节码&#xff08;.class文件&#xff09;…

专题十一_递归_回溯_剪枝_综合练习_算法专题详细总结

目录 1. 找出所有⼦集的异或总和再求和&#xff08;easy&#xff09; 解析&#xff1a; 方法一&#xff1a; 解法二&#xff1a; 总结&#xff1a; 2. 全排列 Ⅱ&#xff08;medium&#xff09; 解析&#xff1a; 解法一&#xff1a;只关心“不合法”的分支 解法二&…

AI比诺奖得主更聪明。。。

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI圈又发生了哪些新鲜事&#xff1f; 特斯拉Optimus人形机器人亮相&#xff1a;日常任务好帮手 特斯拉在Cybercab活动上展示了其新款人形机器人Optimus&#xff0c;这款机器人能够执行拿包裹、浇水等…

CentOS快速配置网络Docker快速部署

CentOS快速配置网络&&Docker快速部署 CentOS裸机Docker部署1.联通外网2.配置CentOS镜像源3.安装Docker4.启动Docker5.CentOS7安装DockerCompose Bug合集ERROR [internal] load metadata for docker.io/library/java:8-alpineError: Could not find or load main class …

20241013组会

文章&#xff1a;A learnable end-edge-cloud cooperative network for driving emotion sensing 引言&#xff1a; 驾驶员的情绪状态直接影响安全驾驶。在“车-人-路-云”一体化控制框架下&#xff0c;我们提出了一种端-边-云协同情感感知网络模型&#xff08;EEC-Net&#x…

Android平台RTSP|RTMP播放器PK:VLC for Android还是SmartPlayer?

好多开发者&#xff0c;希望在Android端低延迟的播放RTMP或RTSP流&#xff0c;本文就目前市面上主流2个直播播放框架&#xff0c;做个简单的对比。 VLC for Android VLC for Android 是一款功能强大的多媒体播放器&#xff0c;具有以下特点和功能&#xff1a; 广泛的格式支持…

FPAG学习(5)-三种方法实现LED流水灯

目录 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 1.1.2仿真代码 1.1.3仿真 1.2实验结果 1.2.1总结 2.循环移位实现LED流水灯 3.38译码器实现LED流水灯 3.1原理 3.2源程序 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 利用计数器计数到…

【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5

【深度学习】经典的深度学习模型-01 开山之作&#xff1a;CNN卷积神经网络LeNet-5 Note: 草稿状态&#xff0c;持续更新中&#xff0c;如果有感兴趣&#xff0c;欢迎关注。。。 0. 论文信息 article{lecun1998gradient, title{Gradient-based learning applied to document r…

【智能算法应用】长鼻浣熊优化算法求解二维路径规划问题

摘要 本文采用长鼻浣熊优化算法 (Coati Optimization Algorithm, COA) 求解二维路径规划问题。COA 是一种基于长鼻浣熊的觅食和社群行为的智能优化算法&#xff0c;具有快速收敛性和较强的全局搜索能力。通过仿真实验&#xff0c;本文验证了 COA 在复杂环境下的路径规划性能&a…

【微服务】springboot3 集成 Flink CDC 1.17 实现mysql数据同步

目录 一、前言 二、常用的数据同步解决方案 2.1 为什么需要数据同步 2.2 常用的数据同步方案 2.2.1 Debezium 2.2.2 DataX 2.2.3 Canal 2.2.4 Sqoop 2.2.5 Kettle 2.2.6 Flink CDC 三、Flink CDC介绍 3.1 Flink CDC 概述 3.1.1 Flink CDC 工作原理 3.2 Flink CDC…

数据结构:栈的创建、使用以及销毁

这里写目录标题 栈的结构与概念栈底层结构的选取栈的代码实现&#xff08;stack&#xff09;头文件&#xff08;stack.h&#xff09;栈的初始化栈的销毁入栈出栈获取栈顶数据获取栈大小代码的测试 栈的结构与概念 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的…

【算法篇】动态规划类(1)(笔记)

目录 一、理论基础 1. 大纲 2. 动态规划的解题步骤 二、LeetCode 题目 1. 斐波那契数 2. 爬楼梯 3. 使用最小花费爬楼梯 4. 不同路径 5. 不同路径 II 6. 整数拆分 7. 不同的二叉搜索树 一、理论基础 1. 大纲 动态规划&#xff0c;英文&#xff1a;Dynamic Programm…

企业水、电、气、热等能耗数据采集系统

介绍 通过物联网技术&#xff0c;采集企业水、电、气、热等能耗数据&#xff0c;帮企业建立能源管理体系&#xff0c;找到跑冒滴漏&#xff0c;从而为企业节能提供依据。 进一步为企业实现碳跟踪、碳盘查、碳交易、谈汇报的全生命过程。 为中国碳达峰-碳中和做出贡献。 针对客…

【C++进阶】set的使用

1. 序列式容器和关联式容器 前面&#xff0c;我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间⼀般没有紧…