React:封裝一個評論回復組件

分析

用戶想要一個能夠顯示評論列表,并且允許用戶進行回復的組件。可能還需要支持多級回復,也就是對回復進行再回復。然后,我要考慮組件的結構和功能。

首先,數據結構方面,評論應該包含id、內容、作者、時間,以及可能的子回復。子回復的結構可能和評論類似,所以可以設計一個通用的結構,比如每個評論有一個replies數組,里面存放回復對象。

接下來是組件的狀態管理。評論列表應該用useState來管理,這樣當添加新評論或回復時,組件可以重新渲染。還需要處理用戶輸入,所以需要狀態來保存輸入的文本。

然后是UI部分。評論和回復可能需要遞歸渲染,因為每個回復下面可能還有更多的回復。所以可以考慮用一個遞歸組件來渲染評論及其子回復。每個評論項需要顯示作者、內容、時間,還有一個回復按鈕。點擊回復按鈕時,要顯示一個輸入框,讓用戶輸入回復內容。

輸入框部分,可能需要根據當前回復的父評論ID來判斷在哪里顯示輸入框。例如,當點擊某個評論的回復按鈕時,輸入框應該出現在該評論的下方。因此,需要有一個狀態來跟蹤當前正在回復的評論ID。

提交回復的函數需要處理兩種情況:一種是直接評論,另一種是回復某個具體的評論。提交時,需要更新評論列表,添加新的回復到對應的replies數組中。這里可能需要一個函數來遞歸查找父評論并添加回復,或者使用輔助函數來處理嵌套結構。

樣式方面,用戶可能希望有不同的縮進來表示層級關系。比如,頂級評論沒有縮進,一級回復縮進一定距離,二級回復再縮進更多,以此類推。可以用paddingLeft或者marginLeft來實現,根據層級動態調整。

還需要考慮組件的可定制性,比如允許用戶傳入自定義樣式、評論和回復的渲染方法,或者回調函數當提交評論時。這樣組件更靈活,用戶可以根據需要調整外觀和行為。

測試一下功能,比如添加評論、回復評論,確保狀態更新正確,UI渲染正確。特別是多級回復的情況,要確保遞歸渲染正確,并且輸入框出現在正確的位置。

能的優化點:使用useCallback來避免函數重復創建,提高性能。特別是提交回復的函數和回復按鈕的回調函數。另外,對于深層嵌套的評論,遞歸渲染可能會導致性能問題,但一般情況下的評論層級不會太深,所以應該可以接受。

最后,提供示例用法,讓用戶知道如何傳入初始數據,以及如何使用組件。可能需要提醒用戶根據需要調整樣式,或者處理時間格式化等問題,比如使用date-fns或其他庫來格式化時間顯示。

實現代碼

封裝一個可復用的評論回復組件,支持多級嵌套回復。以下是代碼實現:

import React, { useState } from 'react';
import PropTypes from 'prop-types';// 評論項組件
const CommentItem = ({ comment,depth = 0,onReply,activeReplyId,setActiveReplyId,parentAuthor 
}) => {const maxDepth = 4; // 控制最大嵌套深度const canReply = depth < maxDepth;return (<div className="comment-item" style={{ marginLeft: depth * 32 }}><div className="comment-header"><span className="comment-author">{comment.author}</span>{parentAuthor && (<span className="reply-to">回復 @{parentAuthor}</span>)}<span className="comment-time">{comment.time}</span></div><div className="comment-content">{comment.content}</div>{canReply && (<button className="reply-btn"onClick={() => setActiveReplyId(comment.id)}>回復</button>)}{/* 回復輸入框 */}{activeReplyId === comment.id && (<CommentInputonSubmit={(content) => onReply(comment.id, content)}onCancel={() => setActiveReplyId(null)}/>)}{/* 遞歸渲染子回復 */}{comment.replies?.map((reply) => (<CommentItemkey={reply.id}comment={reply}depth={depth + 1}onReply={onReply}activeReplyId={activeReplyId}setActiveReplyId={setActiveReplyId}parentAuthor={comment.author}/>))}</div>);
};// 評論輸入框組件
const CommentInput = ({ onSubmit, onCancel }) => {const [content, setContent] = useState('');const handleSubmit = () => {if (content.trim()) {onSubmit(content);setContent('');}};return (<div className="comment-input-container"><textareavalue={content}onChange={(e) => setContent(e.target.value)}placeholder="輸入評論內容..."rows={3}/><div className="input-buttons"><button onClick={handleSubmit}>提交</button><button onClick={onCancel}>取消</button></div></div>);
};// 主組件
const CommentComponent = ({ initialComments,currentUser = '匿名用戶'
}) => {const [comments, setComments] = useState(initialComments);const [activeReplyId, setActiveReplyId] = useState(null);// 添加評論/回復const addComment = (content, parentId = null) => {const newComment = {id: Date.now(),author: currentUser,content,time: new Date().toLocaleString(),replies: []};if (!parentId) {setComments([...comments, newComment]);} else {const updateComments = (comments) => comments.map(comment => {if (comment.id === parentId) {return {...comment,replies: [...comment.replies, newComment]};}return {...comment,replies: updateComments(comment.replies)};});setComments(prev => updateComments(prev));}};return (<div className="comment-container"><CommentInput onSubmit={(content) => addComment(content)} /><div className="comments-list">{comments.map((comment) => (<CommentItemkey={comment.id}comment={comment}onReply={addComment}activeReplyId={activeReplyId}setActiveReplyId={setActiveReplyId}/>))}</div></div>);
};// Prop 類型校驗
CommentComponent.propTypes = {initialComments: PropTypes.arrayOf(PropTypes.shape({id: PropTypes.number.isRequired,author: PropTypes.string.isRequired,content: PropTypes.string.isRequired,time: PropTypes.string,replies: PropTypes.array})),currentUser: PropTypes.string
};export default CommentComponent;

組件特性說明:

  1. 核心功能
  • 支持多級嵌套回復(默認最多4層)
  • 顯示回復對象(回復 @xxx)
  • 支持自定義當前用戶
  • 支持初始評論數據傳入
  • 自動生成評論時間
  1. 組件結構
  • CommentComponent:主組件
  • CommentItem:單個評論項(支持遞歸渲染)
  • CommentInput:評論輸入組件
  1. 使用示例
// 初始化數據示例
const initialComments = [{id: 1,author: '用戶A',content: '第一條評論',time: '2023-08-01 10:00',replies: [{id: 2,author: '用戶B',content: '第一條回復',time: '2023-08-01 10:05'}]}
];// 使用組件
<CommentComponent initialComments={initialComments}currentUser="當前用戶"
/>
  1. 樣式建議
.comment-container {max-width: 800px;margin: 0 auto;padding: 20px;
}.comment-item {margin: 16px 0;padding: 12px;border: 1px solid #eee;border-radius: 4px;
}.comment-header {display: flex;align-items: center;margin-bottom: 8px;color: #666;
}.comment-author {font-weight: bold;margin-right: 8px;
}.reply-to {color: #999;margin-right: 8px;
}.comment-time {font-size: 0.9em;
}.reply-btn {background: none;border: none;color: #1890ff;cursor: pointer;padding: 4px 8px;
}.comment-input-container {margin: 16px 0;
}.comment-input-container textarea {width: 100%;padding: 8px;margin-bottom: 8px;
}.input-buttons button {margin-right: 8px;padding: 4px 12px;
}
  1. 擴展建議
  • 增加點贊功能
  • 支持富文本輸入
  • 添加評論刪除功能
  • 支持用戶頭像顯示
  • 增加評論加載更多功能
  • 支持@用戶功能

使用時請根據實際需求調整樣式和功能實現,可以通過props傳遞更多配置項(如最大嵌套深度、日期格式等)來增強組件的靈活性。

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

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

相關文章

wx讀書某sign算法詳解

未加固 版本&#xff1a;9.2.3 前置知識&#xff1a; (v41 & 0xFFFFFFFFFFFFFFFELL) 是一種高效的奇偶檢查方法&#xff0c;用于判斷數值 v41 是否為奇數。 std::sort<std::lessstd::string,std::string &,std::string>(a1, v6, s); 排序算法 # 完全等價的字…

Django的異步任務隊列管理_Celery

1 基本原理 Celery 是一個異步任務隊列&#xff0c;能夠將耗時操作&#xff08;如發郵件、處理圖片、網絡爬蟲等&#xff09;從 Django 主線程中分離出來&#xff0c;由后臺的 worker 處理&#xff0c;避免阻塞請求。Celery 作為獨立運行的后臺進程&#xff08;Worker&#xf…

【計算機網絡】Linux網絡的幾個常用命令

&#x1f4da; 博主的專欄 &#x1f427; Linux | &#x1f5a5;? C | &#x1f4ca; 數據結構 | &#x1f4a1;C 算法 | &#x1f152; C 語言 | &#x1f310; 計算機網絡 相關文章&#xff1a;計算機網絡專欄 目錄 ping&#xff08;檢測網絡連通性&#xff09;…

全開源、私有化部署!輕量級用戶行為分析系統-ClkLog

ClkLog是一款支持私有化部署的全開源埋點數據采集與分析系統&#xff0c;兼容Web、App、小程序多端埋點&#xff0c;快速洞察用戶訪問路徑、行為軌跡&#xff0c;并生成多維用戶畫像。助力中小團隊搭建輕量靈活的用戶行為分析平臺。 為什么需要一款私有化的埋點分析系統&#x…

golang定時器的精度

以 go1.23.3 linux/amd64 為例。 定時器示例代碼&#xff1a; package mainimport ("context""fmt""time" )var ctx context.Contextfunc main() {timeout : 600 * time.Secondctx, _ context.WithTimeout(context.Background(), timeout)dea…

svn 遠程服務搜索功能

svn服務器沒有遠程搜索功能&#xff0c;靠人工檢索耗時耗力&#xff0c;當服務器文件過多時&#xff0c;全部checkout到本地檢索&#xff0c;耗時太久。 1. TortoiseSVN 安裝注意事項 下載官網地址&#xff1a;https://tortoisesvn.en.softonic.com/download 安裝時選中 co…

uniapp-商城-39-shop 購物車 選好了 進行訂單確認4 配送方式2 地址頁面

上面講基本的樣式和地址信息&#xff0c;但是如果沒有地址就需要添加地址&#xff0c;如果有不同的地址就要選地址。 來看看處理方式&#xff0c; 1、回顧 在delivery-layout中 methods:{goAddress(){uni.navigateTo({url:"/pagesub/pageshop/address/addrlist"})…

Linux命令-iostat

iostat 命令介紹 iostat 是一個用于監控 Linux 系統輸入/輸出設備加載情況的工具。它可以顯示 CPU 的使用情況以及設備和分區的輸入/輸出統計信息&#xff0c;對于診斷系統性能瓶頸&#xff08;如磁盤或網絡活動緩慢&#xff09;特別有用。 語法&#xff1a; iostat [options…

vue2關于Node.js17及以上報digital envelope錯誤的解決辦法

文章目錄 簡介錯誤原因解決方案設置環境變量修改package.json安裝舊版本Node.js更新依賴項更改加密設置 簡介 digital envelope routines::unsupported錯誤?通常發生在Node.js版本升級到17或更高版本后&#xff0c;因為這些版本開始使用OpenSSL 3.0&#xff0c;它對算法和密鑰…

LLM - Large Language Model

回顧2024&#xff1a;與LLM又相伴一年的經歷與思考 - 知乎萬字長文入門大語言模型&#xff08;LLM&#xff09; - 知乎“大模型本質就是兩個文件&#xff01;”特斯拉前AI總監爆火LLM科普&#xff0c;時長1小時&#xff0c;面向普通大眾 - 知乎大模型本質及趨勢剖析&#xff0c…

Linux 內核網絡協議棧中的關鍵數據結構:inet_skb_parm 與 ip_options

在 Linux 內核的網絡協議棧中,數據包的高效處理依賴于一系列精心設計的數據結構。這些結構體不僅需要存儲網絡數據的元信息,還需支持復雜的協議邏輯(如路由、分片、安全策略等)。本文聚焦兩個核心結構體 struct inet_skb_parm 和 struct ip_options,解析它們的設計原理、功…

如何修復卡在恢復模式下的 iPhone:簡短指南

Apple 建議使用恢復模式作為最后的手段&#xff0c;以便在 iPhone 啟動循環或顯示 Apple 標志時恢復 iPhone。這是解決持續問題的簡單方法&#xff0c;但您很少使用。但是&#xff0c;當您的 iPhone 卡住恢復模式本身時&#xff0c;您會怎么做&#xff1f;雖然 iPhone 卡在這種…

10前端項目----商品詳情頁/滾輪行為

商品詳情頁面 商品詳情組件發送請求獲取相應商品詳情信息組件展示數據 優化一下路由配置代碼滾輪自動置頂 商品詳情組件 路由配置 點擊商品進行跳轉—將Detail組件變成路由組件 從商品到詳情&#xff0c;肯定需要傳參(產品ID)告訴Detail是哪個商品&#xff0c;需要展示哪個商品…

DIFY 又跟新了,來到 1.3.0 版本,看正文

歡迎來到 1.3.0 版本&#xff01;添加了各種巧妙的功能、修復了錯誤&#xff0c;并帶來了一些新功能&#xff1a; 一、核心亮點&#xff1a; 結構化輸出 1、LLM 節點新增JSON Schema編輯器&#xff0c;確保大語言模型能夠返回符合預設格式的JSON數據。這一功能有助于提升數據…

git檢查提交分支和package.json的version版本是否一致

這里寫自定義目錄標題 一、核心實現步驟?1.安裝必要依賴?2.初始化 Husky?3.創建校驗腳本?4.配置 lint-staged?5.更新 Husky 鉤子? 三、工作流程說明?四、注意事項? 以下是基于 Git Hooks 的完整解決方案&#xff0c;通過 husky 和自定義腳本實現分支名與版本號一致性校…

react-navigation-draw抽屜導航

心得寫在前面分享給大家&#xff1a; 我的實現方法&#xff0c;并沒有完全安裝官網來做&#xff0c;而是進行了簡化&#xff0c;效果是一樣的。沒有按照官網說的修改metro.config.js文件&#xff0c;同時也沒有 react-native-gesture-handler 的安裝后&#xff0c;我們需要有條…

【計算機視覺】CV實戰項目-高分辨率遙感圖像語義分割:High-Resolution-Remote-Sensing-Semantic-Segmentation

高分辨率遙感圖像語義分割技術解析與實戰指南 項目背景與意義核心技術解析1. **膨脹預測&#xff08;Dilated Prediction&#xff09;**2. **后處理優化**3. **半監督學習&#xff1a;偽標簽&#xff08;Pseudo Labeling&#xff09;**4. **可視化與監控** 實戰指南&#xff1a…

免費送源碼:Java+SSM+MySQL 基于SSM開發的校園心理咨詢平臺系統的設計與實現 計算機畢業設計原創定制

目 錄 1 緒論 1 1.1 研究背景 1 1.2開發現狀 1 1.3論文結構與章節安排 2 2 校園心理咨詢平臺系統系統分析 3 2.1 可行性分析 3 2.1.1 技術可行性分析 3 2.1.2 經濟可行性分析 3 2.1.3 法律可行性分析 3 2.2 系統功能分析 3 2.2.1 功能性分析 4 2.2.2 非功能性分析…

學習筆記:Qlib 量化投資平臺框架 — GETTING STARTED

學習筆記&#xff1a;Qlib 量化投資平臺框架 — GETTING STARTED Qlib 是微軟亞洲研究院開源的一個面向人工智能的量化投資平臺&#xff0c;旨在實現人工智能技術在量化投資中的潛力&#xff0c;賦能研究&#xff0c;并創造價值&#xff0c;從探索想法到實施生產。Qlib 支持多種…

cmake qt 項目編譯

當前MAC 編譯命令 rm -rf build 刪除之前build記錄 mkdir build && cd build 重新生成build文件夾 cmake -DCMAKE_PREFIX_PATH"/usr/local/opt/qt" .. Cmake編譯指定我的qt路徑 cmake --build . 生成程序 程序生成后如此 第三方庫單獨下載 在CMakeLis…