07 React 添加列表

js 复制代码
import React, {useState} from "react";
import styles from "./App.module.css"

// 枚举定义排序方式
const SortType = {
    NEWEST: 'NEWEST',
    LIKES: 'LIKES'
}
const CommentForm = ({onAddComment}) => {
    const [newCommentText, setNewCommentText] = useState('');

    const handleAddComment = () => {
        if (newCommentText.trim() !== '') {
            onAddComment(newCommentText);
            setNewCommentText('');
        }
    };

    return (
        <div>
            <input
                type="text"
                value={newCommentText}
                onChange={(e) => setNewCommentText(e.target.value)}
                placeholder="输入你的评论"
            />
            <button onClick={handleAddComment}>提交评论</button>
        </div>
    );
};

const CommentList = ({initialComments}) => {
    const [comments, setComments] = useState(initialComments);
    const [sortType, setSortType] = useState(SortType.NEWEST);

    const getCurrentDate = () => {
        const currentDate = new Date();

        const year = currentDate.getFullYear();
        const month = String(currentDate.getMonth() + 1).padStart(2, '0');
        const day = String(currentDate.getDate()).padStart(2, '0');
        const hours = String(currentDate.getHours()).padStart(2, '0');
        const minutes = String(currentDate.getMinutes()).padStart(2, '0');
        const seconds = String(currentDate.getSeconds()).padStart(2, '0');

        const formattedDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
        return formattedDateTime
    }

    const addComment = (text) => {
        const newComment = {
            id: comments.length + 1,
            username: 'New User', // 你可能需要添加用户输入用户名的逻辑
            date: getCurrentDate(), // 当前日期
            likes: 0, // 新评论的点赞数
            text: text // 新评论的内容
        };

        refreshComments(sortType, [...comments, newComment])
    };

    // 删除评论
    const deleteComment = (id) => {
        setComments(comments.filter(comment => comment.id !== id));
    };

    // 排序
    const sortBy = (type) => {
        refreshComments(type, comments)
    };

    const refreshComments = (type, comments) => {
        if (type === SortType.NEWEST) {
            setSortType(SortType.NEWEST);
            setComments([...comments].sort((a, b) => new Date(b.date) - new Date(a.date)));
        } else if (type === SortType.LIKES) {
            setSortType(SortType.LIKES);
            setComments([...comments].sort((a, b) => b.likes - a.likes));
        }
    }

    return (
        <div>
            <CommentForm onAddComment={addComment}/>

            <button className={sortType === SortType.NEWEST ? styles.active : ''}
                    onClick={() => sortBy(SortType.NEWEST)}>最新排序
            </button>
            <button className={sortType === SortType.LIKES ? styles.active : ''}
                    onClick={() => sortBy(SortType.LIKES)}>点赞排序
            </button>

            {comments.map(comment => (
                <div key={comment.id}>
                    <p>{comment.username} - {comment.date} - Likes: {comment.likes} {comment.text}</p>
                    {/*判断评论id只有为1的时候,才删除*/}
                    {comment.id === 1 && <button onClick={() => deleteComment(comment.id)}>删除评论</button>}
                </div>
            ))}
        </div>
    )
};

function App() {
    const getRandomDate = () => {
        const year = 2023;
        const month = Math.floor(1 + Math.random() * 5); // March
        const day = Math.floor(1 + Math.random() * 10);
        const hour = Math.floor(Math.random() * 24); // Random hour between 0 and 23
        const minute = Math.floor(Math.random() * 60); // Random minute between 0 and 59
        const second = Math.floor(Math.random() * 60); // Random second between 0 and 59
        const content = `${year}-${
            month.toString().padStart(2, '0')
        }-${
            day.toString().padStart(2, '0')
        } ${
            hour.toString().padStart(2, '0')
        }:${
            minute.toString().padStart(2, '0')
        }:${
            second.toString().padStart(2, '0')
        }`;
        console.log(content)
        return content
    };

    const initialComments = [
        {id: 1, username: 'User1', date: getRandomDate(), likes: 10, text: '这是一个示例评论。'},
        {id: 2, username: 'User2', date: getRandomDate(), likes: 5, text: '这也是一个示例评论。'},
        {id: 3, username: 'User3', date: getRandomDate(), likes: 8, text: '这是第三个示例评论。'},
        {id: 4, username: 'User4', date: getRandomDate(), likes: 3, text: '这是第四个示例评论。'},
        {id: 5, username: 'User5', date: getRandomDate(), likes: 12, text: '这是第五个示例评论。'},
        {id: 6, username: 'User6', date: getRandomDate(), likes: 7, text: '这是第六个示例评论。'},
        {id: 7, username: 'User7', date: getRandomDate(), likes: 15, text: '这是第七个示例评论。'},
        {id: 8, username: 'User8', date: getRandomDate(), likes: 2, text: '这是第八个示例评论。'},
        {id: 9, username: 'User9', date: getRandomDate(), likes: 9, text: '这是第九个示例评论。'},
        {id: 10, username: 'User10', date: getRandomDate(), likes: 6, text: '这是第十个示例评论。'}
    ];


    return (
        <>
            <CommentList initialComments={initialComments}/>
        </>
    );
}

export default App;
相关推荐
panxianren2 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
陈随易3 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
可乐鸡翅yeah_5 小时前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8
福兮说5 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
Ai-_Man6 小时前
您您这可以把Grok的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑
传人once6 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.467 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
liangshanbo12157 小时前
JavaScript 异步核心主线
javascript·事件循环·异步操作
传人once8 小时前
悬停旋转放大和位移效果如何写
javascript·css·动画
库拉镜像AI牛牛8 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别