[uniapp] uni-ui+vue3.2小程序评论列表组件 回复评论 点赞和删除

先看效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

下载地址

uni-app官方插件市场: cc-comment组件

环境

基于vue3.2和uni-ui开发;
依赖版本参考如下:

    "dependencies": {"@dcloudio/uni-mp-weixin": "3.0.0-3090820231124001","@dcloudio/uni-ui": "^1.4.28","uni-ui": "^1.0.0","vue": "^3.2.45"},"devDependencies": {"vite": "4.0.3"}
}

小程序调试基础库: 3.3.0

场景

即拿即用, 组件有详细注释内容, 方便二次开发;
目前仅在小程序使用, 其他平台能否使用请评论留言反馈谢谢, 祝大家使用愉快.

附言

主要是插件市场没找到满意的, 诸多用着也不顺, 所以有了cc-comment, 如有Bug请留言或Email, 开源不易且用且珍惜, 感谢使用.
关于功能样式, 主打一个借鉴如下;
参考[小红书]App的评论回复功能: 点击评论内容展示回复弹窗, 二级评论默认显示一条, 点击展开查看更多, 无评论收起功能.
参考[什么值得买]App的多层级回复评论title显示效果

功能

已实现
  • 无评论显示场景 √
  • 显示评论数量(新增和删除动态更新数量) √
  • 发起新评论 √
  • 点击评论内容回复 √
  • 回复一级评论 √
  • 回复二级评论 √
  • 展开二级评论 √
  • 展开超长评论内容 √
  • 不能回复自身评论 √
  • 删除 √
  • 仅可删除自身评论 √
  • 可选三类删除模式 √
  • 点赞 √
  • 点赞大于100显示99+ √
待实现
  • 图片上传 ×

有其他需求的评论区留言

:props 属性

属性名说明类型默认值必填说明
ref实例Object-true
tableData评论列表Array[ ]true
tableTotal评论总数Number0true
deleteMode评论删除模式Stringallfalsebind-当被删除的一级评论存在回复评论, 那么该评论内容变更显示为[当前评论内容已被移除] only-仅删除当前评论(后端删除相关联的回复评论, 否则总数显示不对) all-删除所有评论包括回复评论

deleteMode

@event 事件

属性名说明参数说明
likeClick点赞事件{{params},callback}{ params: 评论id }, callback回调函数, 请求后端接口后调用, 执行后续逻辑
replyClick回复事件{{params},callback}{ params:评论参数 }, callback回调函数, 请求后端接口后调用, 执行后续逻辑
deleteClick删除事件{{params,mode},callback}{ params: 评论数组id, mode:删除模式[all,bind,only] }, callback回调函数, 请求后端接口后调用, 执行后续逻辑

$ref 实例可调用属性&事件

属性名说明回调参数说明平台差异说明
newCommentFun发起新评论-event-

数据说明

// 用户信息
type userInfoKeys = {id: number // 用户iduser_name: string // 用户名user_avatar: string // 用户头像地址
}
// 评论表
type tableDataKeys = {id: number // 评论idparent_id: number // 父级评论idreply_id: number // 被回复人评论idreply_name: string // 被回复人名称user_name: string // 用户名user_avatar: string // 评论者头像地址user_content: string // 评论内容is_like: boolean // 是否点赞like_count: number // 点赞数统计create_time: string // 创建时间
}

使用方法

<template><CCommentref="ccRef"v-model:userInfo="userInfo"v-model:tableData="tableData"v-model:tableTotal="tableTotal"@likeFun="likeFun"@replyFun="replyFun"@deleteFun="deleteFun":deleteMode="deleteMode"></CComment><view @tap="openComment">评论</view>
</template><script setup>
import CComment from "@/components/cc-comment";// 发起新评论
let ccRef = ref(null);
function openComment() {ccRef.value.newCommentFun();
}// 点赞回调事件
function likeFun({ params }, callback) {console.log("likeFun", params);// 当请求失败, 调用callback重置点赞效果;// Demo如下:// axios.post("http://xxx/like", { id: params }).then((res) => {//   if (res.code !== 0) {//     callback(res);//   }// });
}// 回复回调事件
function replyFun({ params }, callback) {console.log("replyFun", params);// 当请求成功, 调用callback执行评论插入;// Demo如下:// axios.post("http://xxx/reply", { ...params }).then((res) => {//   if (res.code === 0) {//     callback(res);//   }// });const res = { id: Math.random() }; // 很重要的回参! 必须拿到后端返回评论id! 删除需要!setTimeout(() => callback(res), 500); // 目前为了展示效果, 直接执行callback
}/** 删除回调事件* mode 删除模式* -- bind: 当被删除的一级评论存在回复评论, 那么该评论内容变更显示为[当前评论内容已被移除]* -- only: 仅删除当前评论(后端删除相关联的回复评论, 否则总数显示不对)* -- all : 删除所有评论包括回复评论*/
const deleteMode = ref("all");
function deleteFun({ params, mode }, callback) {console.log("deleteFun", { params, mode });// 当请求成功, 调用callback执行评论删除;switch (deleteMode) {case "bind":// 逻辑: 调用接口进行评论内容修改 updatesetTimeout(() => callback(), 500); // 目前为了展示效果, 直接执行callbackbreak;case "only":// 逻辑: 调用接口删除一个评论 deletesetTimeout(() => callback(), 500); // 目前为了展示效果, 直接执行callbackbreak;default:// all// 逻辑: 调用接口删除多个评论 [delete]// Demo如下:// axios.post("http://xxx/delete", { ids: params }).then((res) => {//   if (res.code === 0) {//     callback(res);//   }// });setTimeout(() => callback(), 500); // 目前为了展示效果, 直接执行callbackbreak;}
}// ----模拟数据------模拟数据------模拟数据----
// 当前登录用户信息
let userInfo = reactive({id: 120, // 评论iduser_name: "ikun", // 用户名user_avatar:"https://pic1.zhimg.com/80/v2-a79071a705f55c5d88f6c74e6111fe84_720w.webp", // 用户头像
});
let tableTotal = ref(4);// 评论总数
let tableData = reactive([{id: 120, // 评论idparent_id: null, // 父级评论idreply_id: null, // 被回复人评论idreply_name: null, // 被回复人名称user_name: "ikun", // 用户名user_avatar:"https://pic1.zhimg.com/80/v2-a79071a705f55c5d88f6c74e6111fe84_720w.webp", // 评论者头像地址user_content: "唱,跳,rap,篮球", // 评论内容is_like: false, // 是否点赞like_count: 120, // 点赞数统计create_time: "2024-01-01 09:16", // 创建时间},{id: 130,parent_id: 120, // 评论的父级idreply_id: 120, // 被回复评论idreply_name: "ikun", // 被回复人名称user_name: "小黑子", // 用户名user_avatar:"https://pic2.zhimg.com/80/v2-06eade66ec837713d765b1557bf20b25_720w.webp", // 评论者头像地址user_content: "姬霓太美", // 评论内容is_like: false, // 是否点赞like_count: 67, // 点赞数统计create_time: "2024-01-01 17:06", // 创建时间},{id: 140,parent_id: 120, // 评论的父级idreply_id: 130, // 被回复评论idreply_name: "小黑子", // 被回复人名称user_name: "守护宗主维护宗门", // 用户名user_avatar:"https://pic3.zhimg.com/80/v2-244696a62fa750b8570cf56bfaa5b26a_720w.webp", // 评论者头像地址user_content: "你露出鸡脚了", // 评论内容is_like: false, // 是否点赞like_count: 16, // 点赞数统计create_time: "2024-01-02 23:08", // 创建时间},{id: 150,parent_id: null, // 评论的父级idreply_id: null, // 被回复评论idreply_name: null, // 被回复人名称user_name: "音乐制作人", // 用户名user_avatar:"https://pic2.zhimg.com/80/v2-88ec6f8c6d3305122664dd18a28730e5_720w.webp", // 评论者头像地址user_content:"只因你太美baby 只因你太美baby 只因你实在是太美baby 只因你太美baby 迎面走来的你让我如此蠢蠢欲动 这种感觉我从未有 Cause I got a crush on you who you 你是我的 我是你的 谁 再多一眼看一眼就会爆炸 再近一点靠近点快被融化", // 评论内容is_like: true, // 是否点赞like_count: 8, // 点赞数统计create_time: "2024-01-08 00:45", // 创建时间},
]);// 评论表</script>

再放一遍下载地址

uni-app官方插件市场: cc-comment组件

感谢使用

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

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

相关文章

spring boot 自动扫描Controller、Service、Component原理

项目里面为什么不加上ComponentScan("com.yym.*")注解&#xff0c;也能加载到子目录里面的Controller&#xff0c;Service&#xff0c;Component的bean呢&#xff1f; 启动类没有ComponentScan注解 SpringBootApplication public class BootStrap {public static v…

非常好用的三款图片模糊变清晰的软件

在数字时代&#xff0c;照片的清晰度对于呈现高质量的视觉效果至关重要。然而&#xff0c;由于各种原因&#xff0c;我们有时会遇到模糊的照片。这时候&#xff0c;使用适当的软件来提高照片的清晰度就显得尤为重要。本文将介绍一些可以使模糊照片变清晰的软件&#xff0c;帮助…

前端面试题集合七(ES6、ES7、ES8、ES9、ES10、ES11、ES12)

ES6&#xff08;2015&#xff09; 1. 类&#xff08;class&#xff09; class Man {constructor(name) {this.name 小豪;}console() {console.log(this.name);} } const man new Man(小豪); man.console(); // 小豪 2. 模块化(ES Module) // 模块 A 导出一个方法 export …

Redis:原理速成+项目实战——Redis实战5(互斥锁、逻辑过期解决缓存击穿问题)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战4&#xff08;解决Redis缓存穿透、雪崩、击穿&#xff09; &#x1f4da;订阅专…

Python(30):非对称加密算法RSA的使用(openssl生成RSA公私钥对)

Python(30)&#xff1a;非对称加密算法RSA的使用(openssl生成RSA公私钥对) 1、openssl生成RSA公私钥对 1.1、生成RSA公私钥对命令 [rootloaclhost ~]# openssl OpenSSL> genrsa -out rsa_private_key.pem 1024 Generating RSA private key, 1024 bit long modulus .. ...…

LeetCode(209)长度最小的子数组⭐⭐

给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3]输出&#xff1a;2…

AIGC无人直播系统技术

随着信息技术的快速发展和互联网的普及&#xff0c;直播行业迎来了蓬勃发展的机遇。然而&#xff0c;传统的直播方式存在一些局限性&#xff0c;如场地限制、设备携带不便等问题。为了解决这些问题&#xff0c;AIGC推出了一项创新性的无人直播系统技术。 AIGC无人直播系统技术…

如何寻找到相对完整的真正的游戏的源码 用来学习?

在游戏开发的学习之路上&#xff0c;理论与实践是并重的两个方面。对于许多热衷于游戏开发的学习者来说&#xff0c;能够接触到真实的、完整的游戏源码无疑是一个极好的学习机会。但问题来了&#xff1a;我们该如何寻找到这些珍贵的资源呢&#xff1f; 开源游戏项目 GitHub:地…

还不了解 Dockerfile 的同学不是好测试人

前言&#xff1a;近年来 Docker 非常火&#xff0c;想要玩好 Docker 的话 Dockerfile 是绕不开的&#xff0c;这就好比想要玩好 Linux 服务器绕不开 shell 道理是一样的。 今天我们就来聊一聊 Dockerfile 怎么写&#xff0c;那些指令到底是什么意思。 一、先来看一个简单的 Do…

RK3568上如何使用MPP进行硬解码

目录 前言正文一、FFmpeg 拉流处理二、RK3568 mpp硬解码1、简介2、普通mpp解码流程3、核心代码 END、总结的知识与问题1、一直出现jitter buffer full 这样的问题2、如何打印帧率&#xff1f;3、分析av_packet_alloc、av_init_packet、av_packet_unref、av_packet_free、av_fra…

机器人技能学习-robosuite-0-入门介绍

文章目录 前言模块介绍实战案例1&#xff1a;从 demo 中创建自己的 env案例2&#xff1a;更换属于自己的物体 前言 资料太少、资料太少、资料太少&#xff0c;重要的事说三边&#xff0c;想根据自己实际场景自定义下机器人&#xff0c;结果发现无路可走&#xff0c;鉴于缺少参…

软件测试概念及分类整理汇总

前言 测试小伙伴在谈论软件测试分类&#xff0c;五花八门的分类&#xff0c;眼花缭乱。因为将各个维度划分的内容都整到一块了&#xff0c;在加上各自不同的见解与补充&#xff0c;各种冲突...... Findyou我经过多年测试总结基本定为4类测试(最多5类&#xff0c;自动化或者兼容…

phpstudy面板Table ‘mysql.proc‘ doesn‘t exist解决办法

原因分析&#xff1a;误删了mysql数据库 解决办法如下&#xff1a; 1、停止服务 2、先把mysql文件夹下的data文件夹备份&#xff0c;因为data文件里存有数据库文件。然后再删除data文件。 3、cmd管理员命令进入到mysql中的bin目录下 &#xff0c;执行mysqld --initialize-…

【Python机器学习】用于回归的决策树

用于回归的决策树与用于分类的决策树类似&#xff0c;在DecisionTreeRegressor中实现。DecisionTreeRegressor不能外推&#xff0c;也不能在训练数据范围之外的数据进行预测。 利用计算机内存历史及格的数据进行实验&#xff0c;数据展示&#xff1a; import pandas as pd im…

.mkp勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 在数字时代&#xff0c;勒索病毒如[datastorecyberfear.com].mkp [hendersoncock.li].mkp [myersairmail.cc].mkp正成为企业和个人的噩梦。本文将介绍[datastorecyberfear.com].mkp [hendersoncock.li].mkp [myersairmail.cc].mkp勒索病毒的特点、如何恢复被…

LIN总线故障检测

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 LIN总线自诊断 对LIN数据总线系统进行自诊断时&#xff0c;需使用“LIN主控模块”的“地址码”。 自诊断数…

大功率TVS的基本介绍?|深圳比创达电子

在当今的电子世界里&#xff0c;电路保护变得越来越重要。那么什么是大功率TVS(Transient Voltage Suppressor)&#xff1f;它又是如何发挥作用的呢&#xff1f;TVS二极管&#xff0c;被设计用来保护敏感电子设备免受瞬态电压冲击&#xff0c;尤其是在功率较高的应用中尤为关键…

一文详解VScode 的远程开发

VS code登录服务器后进行编码和调试&#xff0c;VS code上的所有功能都可以使用&#xff0c;和在本地开发基本无区别。 一、配置免密远程登录 因为是要远程登录&#xff0c;那么需要通过使用ssh进行密钥对登录&#xff0c;这样每次登录服务器就可以不用输入密码了。 先来一句官…

常见测试技术都有哪些?

测试技术是用于评估系统或组件的方法&#xff0c;目的是发现它是否满足给定的要求。系统测试有助于识别缺口、错误&#xff0c;或与实际需求不同的任何类型的缺失需求。测试技术是测试团队根据给定的需求评估已开发软件所使用的最佳实践。这些技术可以确保产品或软件的整体质量…

TDuckX 新功能介绍:提交后抽奖!

欢迎来到 TDuckX&#xff0c;我们最近推出了令人兴奋的新功能——提交后抽奖&#xff01;现在&#xff0c;您不仅可以收集用户的宝贵意见&#xff0c;还有机会为他们带来丰厚的奖励。让我们一起来了解这个令人期待的新功能吧&#xff01; 主要功能亮点&#xff1a; 1. 奖品设…