【Vue3组件】分享一下自己写的简约风格评论区组件

news2024/11/25 10:43:51

代码比较简单,方便大家二次开发,旨在快速提供基础的样式模板,自行迭代定制


预览

在这里插入图片描述


简介

data = [
            {
            userImg:'',
            userName:"比克",
            time:'17小时前',
            content:"这生成的真不错呀!",
            ReplyData:[
                {
                    userImg1:'',
                    userName1:'比克大魔王',
                    userImg2:'',
                    userName2:'后方之水',
                    replytime:'6小时前',
                    replycontent:'哈哈哈,多谢夸奖!',
                    anthTags:1
                },
                {
                    userImg1:'',
                    userName1:'后方之水',
                    userImg2:'',
                    userName2:'比克大魔王',
                    replytime:'6小时前',
                    replycontent:'我也要生成同款',
                    anthTags:2
                },
            ]
        }
    ]
  • 使用提示

    • 确认传递给组件的数据严格遵循上述结构,以确保界面的正确显示。
    • 利用Vue 3的Composition API特性,可以进一步优化状态管理和逻辑处理。

代码

父组件

<template>
    <div class="firstglobals">
        <div class="avatar">
            <img :src="data.userImg" style="width: 56px; height: 56px; border-radius: 50%;" alt="" />
        </div>
        <div class="content">
            <div class="usertop">
                <div class="username">{{ data.userName }}</div>
                <div class="time">{{ data.time }}</div>
            </div>
            <div style="display: flex; flex-direction: column; margin-top: 1em;">
                <div class="text">{{ data.content }}</div>
                <div style="display: flex; align-self: flex-end;">
                    <img src="@/assets/globals/点赞默认.png" style="width: 20px;" alt="" />
                </div>
                <div class="but">回复</div>
            </div>
            <div>
                <div v-for="(item, index) in displayedReplies" :key="index">
                    <LuxCommentSectionItem :replyData="item" />
                </div>
                <div v-if="!showAllReplies && data.ReplyData.length > 2" class="load-more"
                    @click="showAllReplies = true">
                    加载更多回复 ...
                </div>
            </div>
        </div>
    </div>
</template>

<script setup lang="ts">
import { ref, computed } from 'vue';
import LuxCommentSectionItem from '@/components/currency/LuxCommentSectionItem.vue';

interface ReplyData {
    userImg1:string,
    userName1:string,
    userImg2:string,
    userName2:string,
    replytime:string,
    replycontent:string,
    anthTags:number
}


interface CommentData {
    userImg: string;
    userName: string;
    time: string;
    content: string;
    ReplyData: ReplyData[];
}

const props = defineProps<{
    data: CommentData;
}>();

const showAllReplies = ref(false);

const displayedReplies = computed(() => {
    if (showAllReplies.value || props.data.ReplyData.length <= 2) {
        return props.data.ReplyData;
    } else {
        return props.data.ReplyData.slice(0, 2);
    }
});
</script>

<style scoped>
.but {
    width: 60px;
    padding: 5px 0px;
    background: #f1f1f1;
    border-radius: 4px;
    display: flex;
    justify-content: center;
    align-content: center;
    font-weight: 400;
    font-size: 14px;
    color: #0f1014;
    text-align: left;
    font-style: normal;
    text-transform: none;
}

.but:hover {
    background: #ebe4e4;
}

.text {
    font-weight: 400;
    font-size: 18px;
    color: #000000;
    line-height: 21px;
    text-align: left;
    font-style: normal;
    text-transform: none;
}

.time {
    font-weight: 400;
    font-size: 12px;
    color: #666666;
    line-height: 14px;
    text-align: left;
    font-style: normal;
    text-transform: none;
}

.avatar {
    width: 56px;
    height: 56px;
    border-radius: 30px;
}

.usertop {
    display: flex;
    flex-direction: column;
    gap: 5px;
}

.username {
    font-weight: 700;
    font-size: 16px;
    color: #0f1014;
    line-height: 19px;
    text-align: left;
    font-style: normal;
    text-transform: none;
}

.content {
    display: flex;
    flex-direction: column;
    margin-left: 1em;
    margin-top: 10px;
    flex: 1;
}

.firstglobals {
    display: flex;
    justify-content: start;
    margin-top: 2em;
}

.load-more {
    margin-top: 30px;
    margin-left: 2em;
    color: #0066cc;
    cursor: pointer;
    font-size: 14px;
    font-size: 14px;
    cursor: pointer;
}


.load-more:hover {
    text-decoration: underline;

}
</style>

子组件

<template>
    <div class="reply-comments">
        <div class="top-user">
            <div style="display: flex;
            justify-content: center;align-content: center;gap: 8px;">
                <img :src="replyData.userImg1" style="width: 24px;height: 24px;border-radius: 50%;" alt="">
                <span class="username">{{ replyData.userName1 }}</span>
            </div>
            <div class="tags" v-if="replyData.anthTags === 1">
                作者
            </div>
            <div class="hf">
                回复
            </div>
            <div style="display: flex;
            justify-content: center;align-content: center;gap: 8px;">
                <img :src="replyData.userImg2" style="width: 24px;height: 24px;border-radius: 50%;" alt="">
                <span class="username">{{ replyData.userName2 }}</span>
            </div>
            <div class="tags" v-if="replyData.anthTags === 2">
                作者
            </div>
            <div class="time">
                {{ replyData.replytime }}
            </div>
        </div>
        <div class="content">
            {{ replyData.replycontent }}
        </div>
        <div style="display: flex;align-self: flex-end;">
            <img src="@/assets/globals/点赞默认.png" style="width: 20px;" alt="">
        </div>
        <div class="but">
            回复
        </div>
    </div>
</template>

<script setup lang="ts">

interface ReplyData {
    userImg1: string,
    userName1: string,
    userImg2: string,
    userName2: string,
    replytime: string,
    replycontent: string,
    anthTags: number
}

const props = defineProps<{
    replyData: ReplyData
}>();
</script>

<style scoped>
.but {
    width: 60px;
    /* height: 28px; */
    padding: 5px 0px;
    background: #F1F1F1;
    border-radius: 4px 4px 4px 4px;
    display: flex;
    justify-content: center;
    align-content: center;
    font-weight: 400;
    font-size: 14px;
    color: #0F1014;
    /* line-height: 16px; */
    text-align: left;
    font-style: normal;
    text-transform: none;
    margin-left: 32px;
}

.but:hover {
    background: #ebe4e4;
}

.content {
    font-weight: 400;
    font-size: 18px;
    color: #000000;
    line-height: 21px;
    text-align: left;
    font-style: normal;
    text-transform: none;
    margin-left: 32px;
    margin-top: 10px;
}

.time {
    font-weight: 400;
    font-size: 12px;
    color: #666666;
    line-height: 14px;
    text-align: left;
    font-style: normal;
    text-transform: none;
}

.hf {
    font-weight: 400;
    font-size: 14px;
    color: #B9B9B9;
    line-height: 16px;
    text-align: left;
    font-style: normal;
    text-transform: none;
}

.tags {
    width: 32px;
    height: 18px;
    background: #0F1014;
    border-radius: 4px 4px 4px 4px;
    color: #fff;
    font-weight: 400;
    font-size: 10px;
    color: #FFFFFF;
    line-height: 12px;
    text-align: center;
    font-style: normal;
    text-transform: none;
    flex-wrap: wrap;
    display: flex;
    justify-content: center;
    align-items: center;
}


.username {
    height: 24px;
    font-weight: 500;
    font-size: 13px;
    color: #0F1014;
    line-height: 15px;
    text-align: left;
    font-style: normal;
    text-transform: none;
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
}

.top-user {
    display: flex;
    align-items: center;
    /* flex-wrap: wrap; */
    gap: 8px;
}

.reply-comments {
    display: flex;
    flex-direction: column;
    margin-top: 1em;
}
</style>

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

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

相关文章

运营管理和服务支撑阶段

我前面的所有设备都部署好了&#xff0c;现在就需要运营管理和服务支撑 遇到问题了迅速解决&#xff0c;避免风险扩大 我们也可以给客户提供上面的服务&#xff0c;提高客户的预警能力&#xff0c;安全风险处理能力 我们不仅提供设备&#xff0c;还提供服务 我们公司成立了安…

如何选择服务器?快解析能搭建私人服务器吗?

随着网络的发展&#xff0c;搭建私人服务器逐渐成为网络达人们的热门选择&#xff0c;比如建立私人性质的博客、论坛、FTP、个人网站、服务器集群等。通过源搭建私人服务器&#xff0c;就可以将很多资源分享到网络上进行信息共享。随之而来的是服务器市场不断扩大&#xff0c;在…

马尔可夫聚类算法

马尔可夫聚类算法&#xff08;Markov Clustering Algorithm&#xff0c;MCL&#xff09;是一种用于图聚类的算法&#xff0c;广泛应用于生物信息学、社交网络分析、推荐系统等领域。 其核心思想是模拟随机游走过程&#xff0c;通过迭代地扩散和收缩图上的概率分布来识别图中的…

Java基础的重点知识-01-基础

文章目录 开发前言Java语言开发环境入门程序说明常量变量和数据类型数据类型转换运算符方法解析 开发前言 常用DOS命令 Java语言的初学者&#xff0c;学习一些DOS命令&#xff0c;会非常有帮助。DOS是一个早期的操作系统&#xff0c;现在已经被Windows系统取代&#xff0c;对于…

【mysql】建库

通过命令建库&#xff1a; CREATE DATABASE database_name; 如果是用Workbench&#xff1a;

React+TS前台项目实战(十六)-- 全局常用组件Pagination封装

文章目录 前言Pagination组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 [PC端&手机端] 总结 前言 在上篇文章中&#xff0c;我们封装了表格组件Table&#xff0c;本文则继续封装配套使用的分页器组件。想看Table表格组件的&#xff0c;可自行查看全局常用组件Tab…

【pytorch04】创建Tensor

numpy中的数据创建tensor 数据已经在numpy中了&#xff0c;将numpy中的数据转到tensor中来&#xff0c;因为我们将使用tensor在GPU上进行加速运算 从NUMPY导入的FLOAT其实是DOUBLE类型 list中的数据创建tensor FloatTensor()和大写的Tensor()接收的是shape&#xff08;即数据的…

敏捷开发笔记(第7章节)--什么是敏捷设计

目录 1&#xff1a;PDF上传链接 7.1: 软件出了什么错 7.2: 设计的臭味--腐化软件的气味 7.2.1: 什么激化了软件的腐化 7.2.2: 敏捷团体不允许软件腐化 7.3: “copy”程序 1: 初始设计 2: 需求在变化 3: 得寸进尺 4: 期望变化 7.3.1: “copy”程序的敏捷设计 7.3.2:…

【职场人】职场故事:与邀功精的共舞

在我的职业生涯中&#xff0c;我遇到过一位特别引人注目的同事&#xff0c;我们都叫他李经理。他的工作能力并不差&#xff0c;但他有一个习惯&#xff0c;那就是喜欢邀功。他的这种习惯&#xff0c;不仅让我印象深刻&#xff0c;也让我在合作中学会了不少东西。 恶心的四件事 …

MySQL学习笔记-进阶篇-视图和存储过程

四、视图和存储过程 视图 存储过程 基本语法 创建 CREATE PROCEDURE ([参数列表]) BEGIN --SQL END; 调用 CALL 存储过程名&#xff08;[参数列表]&#xff09; 查看 --查看指定数据库的存储过程及状态信息 SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SHCEMA…

AI-智能体

什么是 AI 智能体&#xff1f; 「AI 智能体」这个术语并没有真正被定义&#xff0c;对智能体究竟是什么也存在很多的争议。 AI 智能体可以定义为「一个被赋予行动能力的 LLM&#xff08;通常在 RAG 环境中进行函数调用&#xff09;&#xff0c;以便在环境中对如何执行任务做出…

第一次接触Swing

学习java版的HslCommunication发现使用的是Swing&#xff0c;所以了解了一下~ 了解&#xff1a; Swing是Java的标准库&#xff08;Java Foundation Classes, JFC&#xff09;的一部分&#xff0c;用于构建桌面应用程序的图形用户界面&#xff08;GUI&#xff09;。它是Java AWT…

华为某员工爆料:三年前985本科起薪30万,现在硕士起薪还是30w,感慨互联网行情变化

“曾经的30万年薪&#xff0c;是985本科学历的‘标配’&#xff0c;如今硕士也只值这个价&#xff1f;” 一位华为员工的爆料&#xff0c;揭开了互联网行业薪资变化的冰山一角&#xff0c;也引发了不少人的焦虑&#xff1a;互联网人才“通货膨胀”的时代&#xff0c;真的结束了…

Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获

Java-异常&#xff1a;不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获 Java-异常&#xff1a;不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获一、前期准备二、案例分析1、不恰当的异常转换2、不充分日志记录3、过度或不当的异常捕获 三、正确处理方式1…

2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等

6月还有一周就要结束了&#xff0c;我们今天来总结2024年6月上半月发表的最重要的论文&#xff0c;重点介绍了计算机视觉领域的最新研究和进展。 Diffusion Models 1、Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation LlamaGen&#xff0c;是一个…

C++20中的Feature Test Mocros

C20定义了一组预处理器宏&#xff0c;用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制&#xff0c;用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现&#xff0c;它使你能够在编译过程中仔细…

Edge 浏览器退出后,后台占用问题

Edge 浏览器退出后&#xff0c;后台占用问题 环境 windows 11 Microsoft Edge版本 126.0.2592.68 (正式版本) (64 位)详情 在关闭Edge软件后&#xff0c;查看后台&#xff0c;还占用很多系统资源。实在不明白&#xff0c;关了浏览器还不能全关了&#xff0c;微软也学流氓了。…

计算机网络期末

1、IP 地址为:192.168.0.254,它的子网掩码应该为( ) A.255.255.255.0 B.255.255.254.0 C.255.255.252.0 D.255.255.0.0 2、最容易产生网络可靠性瓶颈问题的拓扑构型是&#xff08; &#xff09;。 A 总线型 B 星型 C 环型 D 网状型 3、HTTP 就是电子邮件阅读协议&#xff0…

Android开发实用必备的几款插件,提高你的开发速度

1.GsonFormat 使用方法&#xff1a;快捷键AltS也可以使用AltInsert选择GsonFormat&#xff0c;作用&#xff1a;速将json字符串转换成一个Java Bean&#xff0c;免去我们根据json字符串手写对应Java Bean的过程。 2.ButterKnife Zelezny 又叫黄油刀 使用方法&#xff1a;CtrlS…

Java程序之动物声音“模拟器”

题目&#xff1a; 设计一个“动物模拟器”&#xff0c;希望模拟器可以模拟许多动物的叫声和行为&#xff0c;要求如下&#xff1a; 编写接口Animal&#xff0c;该接口有两个抽象方法cry()和getAnimalName()&#xff0c;即要求实现该接口的各种具体的动物类给出自己的叫声和种类…