鴻蒙HarmonyOS評論功能小demo

評論頁面小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 // 評論的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)
  • 這里需要注意幾點
  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 = ''@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 }

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71609.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解析 SQL,就用 sqlparse!

文章目錄 解析 SQL&#xff0c;就用 sqlparse&#xff01;一、背景&#xff1a;為什么你需要 sqlparse&#xff1f;二、什么是 sqlparse&#xff1f;三、如何安裝 sqlparse&#xff1f;四、簡單易用的庫函數1\. parse(sql)2\. format(sql, **options)3\. split(sql)4\. get_typ…

點云軟件VeloView開發環境搭建與編譯

官方編譯說明 LidarView / LidarView-Superbuild GitLab 我的編譯過程&#xff1a; 安裝vs2019&#xff0c;windows sdk&#xff0c;qt5.14.2&#xff08;沒安裝到5.15.7&#xff09;&#xff0c;git&#xff0c;cmake3.31&#xff0c;python3.7.9&#xff0c;ninja下載放到…

【一文學會 HTML5】

目錄 HTML概述基本概念HTML 發展歷程HTML 基本結構 網頁基本標簽標題標簽&#xff08;<h1> - <h6>&#xff09;段落標簽&#xff08;<p>&#xff09;換行標簽&#xff08;<br>&#xff09;水平線標簽&#xff08;<hr>&#xff09;注釋&#xff0…

Spring Boot面試問答

1. Spring Boot 基礎知識 問題 1:什么是Spring Boot?它與Spring框架有何不同? 回答: Spring Boot是基于Spring框架的一個開源框架,旨在簡化新Spring應用的初始化和開發過程。與傳統的Spring框架相比,Spring Boot提供了以下優勢: 自動配置:根據項目依賴自動配置Spring…

DeepSeek系列模型技術報告的閱讀筆記

DeepSeek系列模型技術報告的閱讀筆記 之前仔細閱讀了DeepSeek系列模型的主要技術方面內容與發展脈絡&#xff0c;以下是DeepSeek系列模型技術報告的筆記&#xff0c;有錯誤的地方歡迎指正&#xff01; 文章目錄 DeepSeek系列模型技術報告的閱讀筆記GQADeepseek MoEAbstractIn…

MyBatis @Param 注解詳解:多參數傳遞與正確使用方式

Param 注解主要用于 MyBatis 進行參數傳遞時給 SQL 語句中的參數 起別名&#xff0c;通常用于 多參數 方法&#xff0c;使參數在 XML Mapper 文件或注解 SQL 語句中更清晰易用。 1. 基本用法 在 Mapper 接口中使用 Param 來為參數命名&#xff0c;避免 MyBatis 解析時出現參數…

OpenBMC:BmcWeb connect讀取http請求

OpenBMC:BmcWeb構造connect對象-CSDN博客 OpenBMC:BmcWeb server.run-CSDN博客 1.構造了connect對象后,通過connection->start()開始處理來自客戶端的請求 //http\http_connection.hpp void start() {...startDeadline();readClientIp();boost::beast::async_detect_ssl…

SparkStreaming之04:調優

SparkStreaming調優 一 、要點 4.1 SparkStreaming運行原理 深入理解 4.2 調優策略 4.2.1 調整BlockReceiver的數量 案例演示&#xff1a; object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…

軟考初級程序員知識點匯總

以下是計算機技術與軟件專業技術資格&#xff08;水平&#xff09;考試&#xff08;簡稱“軟考”&#xff09;中 程序員&#xff08;初級&#xff09; 考試的核心知識點匯總&#xff0c;涵蓋考試大綱的主要方向&#xff0c;幫助你系統復習&#xff1a; 一、計算機基礎 計算機組…

Gauss數據庫omm用戶無法連接處理

確保gauss數據庫服務已經打開 重啟gauss服務 gs_om -t restart 連接gauss gsql -d postgres -p 26000 -r 結果發現 查看數據庫運行情況 gs_om -t status --detail 我們可以看到 cluster_state 的值是 Unavailable 不可用 那么問題大概率是出現在了這里 然后我們再查看一…

36-Openwrt wifi命令工具iwconfig、iwinfo、iwpriv、iwlist

增對wifi的調試命令有很多,這邊列出我們常用的命令提供參考,方便查看信息定位問題。 1、iwconfig 查看當前 WIFI 的工作信道以及工作帶寬模式: root@openwrt:/# iwconfig ra0 ra0 mt7603e ESSID:"openwrt" Mode:Managed Channel:8 Access Point: DC:4B…

Android 低功率藍牙之BluetoothGattDescriptor詳解

BluetoothGattDescriptor 詳解 BluetoothGattDescriptor 是 Android 中用于表示藍牙低功耗&#xff08;BLE&#xff09;設備中 GATT&#xff08;Generic Attribute Profile&#xff09;描述符 的類。描述符是 GATT 架構中的一種屬性&#xff0c;用于提供關于 特征值&#xff0…

計算機畢業設計Python+DeepSeek-R1大模型醫療問答系統 知識圖譜健康膳食推薦系統 食譜推薦系統 醫療大數據(源碼+LW文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

數字體驗推薦TOP8提升用戶參與

數字內容體驗推薦核心優勢 在數字化競爭日益激烈的市場環境中&#xff0c;數字內容體驗的差異化優勢已成為企業突圍的關鍵。通過智能算法驅動的個性化推薦系統&#xff0c;能夠精準捕捉用戶行為軌跡與興趣偏好&#xff0c;實現內容與受眾的動態匹配。這種技術不僅顯著提升頁面…

【每日學點HarmonyOS Next知識】動圖循環播放、監聽tab切換、富文本上下滾動、tab默認居中、a標簽喚起撥號

1、image加載網絡動圖播放一遍后不再播放,有什么方法可以 設置循環播放 目前ArkUI不支持gif圖片設置輪播次數&#xff0c;可通過三方庫ohos-gif-drawable設置輪播次數&#xff0c;在播放一次結束后的回調方法getLoopFinish()中更新播放次數&#xff0c;達到指定次數后設置播放…

redis數據遷移教程(使用RedisShake實現不停機遷移十分便捷)

1.我的場景 需要把本地的redis數據上傳到阿里云服務器上面,服務器上redis并沒有開aof持久化,但是將rdb文件上傳至服務器后每次重啟redis,rdb文件會被覆蓋導致無法同同步數據,最終決定使用RedisShake 2.RedisShake介紹 什么是 RedisShake? RedisShake 是一個用于處理和遷移…

C語言_數據結構總結4:不帶頭結點的單鏈表

純C語言代碼&#xff0c;不涉及C 0. 結點結構 typedef int ElemType; typedef struct LNode { ElemType data; //數據域 struct LNode* next; //指針域 }LNode, * LinkList; 1. 初始化 不帶頭結點的初始化&#xff0c;即只需將頭指針初始化為NULL即可 void Init…

78.StringBuilder簡單示例 C#例子 WPF例子

利用 StringBuilder 提升字符串操作性能 在 C# 中&#xff0c;字符串是不可變的&#xff0c;這意味著每次修改字符串時都會創建一個新的對象。這種特性雖然保證了安全性&#xff0c;但在頻繁修改字符串的場景中會導致性能問題。StringBuilder 正是為解決這一問題而設計的。 什…

【數據集】社區天氣資訊網絡CoWIN-香港小時尺度氣象數據(含MATLAB處理代碼)

社區天氣資訊網絡CoWIN-香港小時尺度氣象數據 數據概述氣象變量說明數據提取(MATLAB全代碼)輸出WRF所需站點氣溫數據參考數據概述 官網-Community Weather Information Network (CoWIN) data policy CoWIN 提供 2010 - 2024 年 的數據下載,每年數據均可單獨下載。下載數據…

【JAVA架構師成長之路】【Redis】第14集:Redis緩存穿透原理、規避、解決方案

30分鐘自學教程&#xff1a;Redis緩存穿透原理與解決方案 目標 理解緩存穿透的成因及危害。掌握布隆過濾器、空值緩存等核心防御技術。能夠通過代碼實現請求攔截與緩存保護。學會限流降級、異步加載等應急方案。 教程內容 0~2分鐘&#xff1a;緩存穿透的定義與核心原因 定義…