【React】使用react hooks實現評論示例

動態效果展示

實現功能

1、渲染評論列表
2、刪除評論
3、渲染導航欄和高亮
4、評論列表排序功能
5、獲取評論
6、點擊發布按鈕發布評論
7、清空輸入框
8、重新聚焦

實現代碼

1、需要引入

import React, { useRef, useState } from 'react'
import avatar from "../logo.png" //頭像
import "./css/index.css" //樣式

2、樣式----[./css/index.css]

* {margin: 0;padding: 0;
}.comment-box {width: 1000px;margin: 20px auto;height: 200px;
}/* 導航欄 */
.comment-tabs {display: flex;align-items: end;font-weight: normal;margin-bottom: 20px;
}.tabs-left {margin-right: 20px;font-size: 14px;
}.tabs-left p span {margin-left: 6px;color: #666;font-size: 10px;
}.tabs-right {display: flex;color: #666;font-size: 10px;
}.tabs-right .active {color: #08a17d;font-weight: 500;
}.tabs-right div span {display: inline-block;margin: 0 6px;height: 6px;border-left: 1px solid #666;
}.tabs-right div:last-child span {border: none;
}/* 發表評論 */
.comment-send {display: flex;align-items: center;justify-content: space-between;height: 40px;
}.avatar {width: 35px;height: 35px;margin-left: 10px;overflow: hidden;border-radius: 35px;border: 1px solid #08a17d;
}.avatar img {width: 100%;height: 100%;
}.comment-send .content {flex: 1;margin: 0 10px;padding: 0 10px;height: 100%;line-height: 40px;border: none;background: #eee;border-radius: 4px;border: 1px solid #eee;
}.comment-send .content:hover {background: none;
}.comment-send .button {width: 80px;height: 100%;color: #fff;text-align: center;line-height: 40px;background: #08a17d;border-radius: 4px;
}.comment-send .button:hover {cursor: pointer;
}/* 評論列表 */
.comment-list {margin-top: 20px;
}.comment-item {display: flex;margin-bottom: 20px;padding-bottom: 10px;border-bottom: 1px solid #eee;
}.comment-item .right {flex: 1;margin-left: 10px;font-size: 10px;color: #666;line-height: 20px;
}.comment-item .right .content {color: #000;font-weight: 500;font-size: 12px;
}.comment-item .right .like {margin: 0 10px;
}.comment-item .right .delete:hover {cursor: pointer;
}

3、數據

// 當前用戶數據
const user = {uid: "10009",avatar,uname: "jock"
}// 導航
const tabs = [{name: "最新",id: 1},{name: "最熱",id: 2},
]
// 評論列表
const comment_list = [{id: "1",content: "真不錯",time: "2020/1/1 12:00:00",like: 1,user: {uid: "10029",avatar,uname: "jock"}},{id: "2",content: "沒毛病",time: "2020/11/01 12:00:00",like: 3,user: {uid: "10009",avatar,uname: "jock"}},{id: "3",content: "真棒",time: "2020/8/21 12:00:00",like: 10,user: {uid: "10008",avatar,uname: "alen"}},
]

4、邏輯處理

export default function Comment() {const [list, setList] = useState(comment_list.sort((a, b) => new Date(b.time) - new Date(a.time)));const [type, setType] = useState(1);const [content, setContent] = useState("");const inputRef = useRef();// tab切換const handleChange = (id) => {setType(id)if (id === 1) {setList(list.sort((a, b) => new Date(b.time) - new Date(a.time)))} else {setList(list.sort((a, b) => b.like - a.like))}}//發布const handleSend = () => {setList([...list, {id: Math.random().toString().slice(2),content,time: new Date().toLocaleString(),like: 0,user}])setContent("");inputRef.current.focus();}// 刪除const handleDel = (id) => {setList(list.filter(item => item.id !== id))}return (<div className='comment-box'>{/* 導航欄 */}<div className='comment-tabs'><div className='tabs-left'><p>評論<span>{list.length}</span></p></div><div className='tabs-right'>{tabs.map(item =><div key={item.id} onClick={() => handleChange(item.id)} className={item.id === type ? 'active' : ''}>{item.name} <span></span></div>)}</div></div><div className='comment-wrap'>{/* 發表評論 */}<div className='comment-send'><div className='avatar'><img src={user.avatar} alt='' /></div><textarea className='content' ref={inputRef} value={content} onChange={(e) => setContent(e.target.value)} placeholder='下面我簡單說兩句' /><div className='button' onClick={() => handleSend()}>發布</div></div>{/* 評論列表 */}<div className='comment-list'>{list.map(item =><div className='comment-item' key={item.id}><div className='avatar'><img src={item.user.avatar} alt='' /></div><div className='right'><p className='username'>{item.user.uname}</p><p className='content'>{item.content}</p><p><span className='time'>{item.time}</span><span className='like'>點贊數: {item.like}</span>{item.user.uid === user.uid && <span className='delete' onClick={() => handleDel(item.id)}>刪除</span>}</p></div></div>)}</div></div></div>)
}

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

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

相關文章

[動態規劃及遞歸記憶搜索法]2.插入乘號

插入乘號 題目描述 給定一個非負整數&#xff0c;用k個乘號將其分割&#xff0c;使得乘積最大。 例如&#xff1a;在整數12345中插入兩個乘號&#xff0c;有以下插入法&#xff1a; 1*2*345 1*23*45 1*234*5 12*3*45 12*34*5 123*4*5 其中最大值是123*4*5 2460 關于輸入 一…

前端小技巧: 面向切面編程在前端代碼中的應用

面向切面編程 面向切面編程在java中提出這類概念但是在js沒有束縛和約定&#xff0c;只需要按編程思想來實現原理在js中使用function或class實現面向切面編程 面向切面概念 AOP (Aspect Oriented Programming) 面向切面編程主要實現目的是針對業務處理過程中的切面進行提取&…

第18章:隨堂復習與企業真題(JDK8-17新特性)

第18章&#xff1a;隨堂復習與企業真題&#xff08;JDK8-17新特性&#xff09; 一、隨堂復習 1. JDK新特性的概述 幾個重要的版本 jdk 5.0 / jdk 8.0 &#xff1a;里程碑式的版本jdk9.0 開始每6個月發布一個新的版本LTS : jdk8 、 jdk 11 、 jdk 17 如何學習新特性 > 角…

Android安全學習路標

1. Android操作系統基礎知識 首先&#xff0c;你需要建立堅實的Android操作系統基礎知識&#xff0c;包括Android架構、進程和內存管理、應用組件和權限模型等基本概念。 2. 安全防范理論 學習關于安全防范理論的基礎知識&#xff0c;包括常見的威脅模型、攻擊類型和安全風險…

Python-猜數字游戲

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主頁&#xff1a;一只程序猿子 博客主頁 &#x1f388; 個人介紹&#xff1a;愛好(bushi)編程&#xff01; &#x1f388; 創作不易&#xff1a;喜歡的話麻煩您點個&#x1f44d;和?&#xff01; &#x1f388;…

免費的AI改寫文案軟件,熱門AI改寫文案軟件【2024】

在數字化時代&#xff0c;文案創作變得更為便捷&#xff0c;其中AI改寫文案軟件的興起為寫作者們帶來了全新的創作體驗。這些工具通過智能算法和自然語言處理技術&#xff0c;能夠快速改寫文本&#xff0c;提高創作效率。本文將深入探討AI改寫文案軟件的現狀&#xff0c;介紹一…

LeetCode題:174. 地下城游戲

目錄 一、題目要求 二、解題思路 &#xff08;1&#xff09;狀態表示 &#xff08;2&#xff09;狀態轉移方程 &#xff08;3&#xff09;初始化dp表 &#xff08;4&#xff09;填表順序 &#xff08;5&#xff09;返回值 三、代碼 一、題目要求 174. 地下城游戲 惡魔們…

swagger入門

swagger入門 pom依賴 不用專門導入swagger 因為springboot已經將它集成了 org.springframework.boot spring-boot-starter com.github.xiaoymin knife4j-spring-boot-starter Swagger配置類 Configuration public class SwaggerConfig { // 創建并配置Docket Bean&#xf…

snakeyaml編輯yaml文件并覆蓋注釋

文章目錄 前言技術積累實戰演示1、引入maven依賴2、覆蓋注釋工具類3、snakeyaml工具類4、測試用例5、測試效果展示 寫在最后 前言 最近在做一個動態整合框架的項目&#xff0c;需要根據需求動態組裝各個功能模塊。其中就涉及到了在application.yaml中加入其他模塊的配置&#…

TCP傳輸層詳解(計算機網絡復習)

介紹&#xff1a;TCP/IP包含了一系列的協議&#xff0c;也叫TCP/IP協議族&#xff0c;簡稱TCP/IP。該協議族提供了點對點的連接機制&#xff0c;并將傳輸數據幀的封裝、尋址、傳輸、路由以及接收方式都予以標準化 TCP/IP的分層模型 在講TCP/IP協議之前&#xff0c;首先介紹一…

力扣貪心題解 跳躍游戲

55. 跳躍游戲 - 力扣&#xff08;LeetCode&#xff09; 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b…

信息系統開發方法

企業信息系統對于企業信息化的重要意義是不言而喻的。從實際運行的效果來看&#xff0c;有些信息系統運行得很成功&#xff0c;取得了巨大的經濟效益和社會效益&#xff1b;但也有些信息系統效果并不顯著&#xff0c;甚至還有個別信息系統開始時還能正常運行&#xff0c;可時間…

廣州數字孿生賦能工業制造,加速推進制造業數字化轉型

廣州數字孿生賦能工業制造&#xff0c;加速推進制造業數字化轉型。數字孿生系統基于歷史數據、實時數據&#xff0c;采用人工智能、大數據分析等新一代信息技術對物理實體的組成、特征、功能和性能進行數字化定義和建模。通過構建在信息世界對物理實體的等價映射&#xff0c;對…

Axure官方軟件安裝、漢化保姆級教程(帶官方資源下載)

1.下載漢化包 百度云鏈接&#xff1a;https://pan.baidu.com/s/1lluobjjBZvitASMt8e0A_w?pwdjqxn 提取碼&#xff1a; jqxn 2.解壓壓縮包 3.安裝Axure 進行安裝 點擊next 打勾&#xff0c;然后next, 默認是c盤&#xff0c;修改成自己的文件夾&#xff08;不要什么都放c盤里…

RestTemplate硬編碼的使用

RestTemplate是由Spring框架提供的一個可用于應用中調用rest服務的類它簡化了與http服務的通信方式&#xff0c;統一了RESTFul的標準&#xff0c;封裝了http連接&#xff0c;我們只需要傳入url及其返回值類型即可。相較于之前常用的HttpClient&#xff0c;RestTemplate是一種更…

API測試基礎之http協議

http簡介&#xff1a; http&#xff08;超文本傳輸協議&#xff09;是一個簡單的請求-響應協議&#xff0c;它通常運行在TCP&#xff08;傳輸控制協議&#xff09;之上。它指定了客戶端可能發送給服務器什么樣的消息以及得到什么樣的響應。請求和響應消息的頭以ASCII碼形式給出…

遠程控制如何賦能智能制造?貝銳向日葵制造業場景案例解析

隨著數字化轉型在制造業的不斷深入&#xff0c;企業在產線端也逐漸投入更多智能化設備&#xff0c;數字化、智能化設備其中一個比較顯著的優勢就是可以依托互聯網實現遠程運維和調試&#xff0c;大大提升產線設備的穩定性和工作效率&#xff1b;而遠程調試運維一個重要的實現方…

人工智能原理復習--搜索策略(一)

文章目錄 上一篇搜索概述一般圖搜索盲目搜索下一篇 上一篇 人工智能原理復習–確定性推理 搜索概述 問題求解分為兩大類&#xff1a;知識貧乏系統&#xff08;依靠搜索技術解決&#xff09;、知識豐富系統&#xff08;依靠推理技術&#xff09; 兩大類搜索技術&#xff1a; …

海思3516DV500下的目標識別算法運行評估,包含yolov7,yolov8

目前在3516DV500下&#xff0c;自己訓練的模型的評估實測結果。根據實際模型會有些許差異。 涉及到技術細節的部分因為商業用途&#xff0c;有部分省略。如需相關技術服務項目合作可私信聯系。 我司推出的目標識別跟蹤模塊&#xff0c;支持熱紅外、可見光主流多光譜視頻輸入與目…

WeiPHP 微信開發平臺 SQL注入漏洞復現

0x01 產品簡介 weiphp 是一個開源,高效,簡潔的微信開發平臺,基于 oneThink 內容管理框架實現。 0x02 漏洞概述 weiphp 微信開發平臺 _send_by_group、 wp_where、 get_package_template等接口處存在 SQL 注入漏洞,攻擊者利用此漏洞可獲取數據庫中的信息(例如,管理員后臺…