在uniapp微信小程序中实现无限级评论(vue递归组件+Java构建所有评论树状结构)

2023-10-28

1. 前言

这是本人毕业设计中其中一个功能点,就是用户在微信小程序(使用uniapp框架)中的首页模块中可以对健身资讯进行评论或者社区模块对别人发布的动态进行评论。

2. 实现效果(最后放个演示视频吧)

在这里插入图片描述

3. 实现思路

(1)首先,在前端页面中编写好一个递归组件,然后在资讯详情模块引用。

为什么要搞个递归组件?
因为,这么多的评论它们肯定是一个树状结构,树状结构得用递归呈现

(2)第二步,就是需要在服务端编写一个接口,查询数据库中所有资讯评论把它们构造成一个树状结构了,我这里使用java语言编写逻辑代码

4. 实现代码

4.1 vue递归组件

(1)创建一个treeComment递归组件

当使用它时,只需要把父组件传来的数据通过props的方式传进去即可。

<template>
	<view>
		<u-toast ref="uToast" />
		<!-- 显示父评论的所有子评论 -->
		<view class="vfor" v-for="(item,index) in commentList" :key="index">
			<view class="item_wrap">
				<view class="left">
					<view class="avatar">
						<u-image width="58rpx" height="58rpx" shape="circle" :src="item.avatar"></u-image>
					</view>
					<view class="nick">
						<text>{{item.nickname}}</text>
					</view>
					<view class="ptime">
						<text>{{item.createTime}}</text>
					</view>
				</view>
			</view> 
			<view class="content" @click="reply(item.nickname,item.id,item.uid)" >
				<view class="reply_to">@{{item.nickname}}:</view>
				<view class="reply_content">{{item.content}}</view>
			</view>
			<tree-comment :commentList="item.commentChildren" :nid="item.nid" :uid="uid"></tree-comment>
		</view>
		<u-mask :show="isInput" @click="maskClick">
			<view class="commentInputView">
				<view class="inputView">
					<u-input v-model="wContent" clearable="false" :focus="focus" confirm-type="评论" @confirm="writePComment"
					 :placeholder="'回复'+nickname" />
				</view>
			</view>
		</u-mask>
		<u-action-sheet :list="myList" v-model="mySheetShow" :cancel-btn="true" @click="mySheetClick()"></u-action-sheet>
		<u-action-sheet :list="otherList" v-model="otherSheetShow" :cancel-btn="true" @click="otherSheetClick()"></u-action-sheet>
	</view>
</template>
<script>
	import treeComment from '../../component/treeComment/treeComment.vue'
	var time = require('../../../common/datetime.js');
	export default {
		components: {
			treeComment
		},
		props: {
			commentList: Array,
			nid: String,
			uid:String
		},
		data() {
			return {
				wContent: '',
				isInput: 0,
				nickname: '',
				focus: false,
				cid: '',
				myList: [{
					text: '回复'
				}, {
					text: '删除'
				}],
				otherList: [{
					text: '回复'
				}, {
					text: '举报'
				}],
				mySheetShow: false,
				otherSheetShow: false
			}
		},
		methods: {
			// 点击用户评论传递参数
			reply(nickname, cid,uid) {
				this.nickname = nickname;
				this.cid = cid; 
				if (uid === this.uid) {
					this.mySheetShow = true;
				} else {
					this.otherSheetShow = true;
				}
			},
			// 点击用户评论弹出遮罩
			maskClick() {
				this.isInput = false;
				this.focus = false;
			},
			// 回复父级评论
			writePComment() {
				this.$u.api.writeComment({
					nid: this.nid,
					pid: this.cid,
					content: this.wContent
				}).then(res => {
					if (res.msg === '评论成功') {
						this.wContent = '';
						this.isInput = false;
						this.$refs.uToast.show({
							title: '评论成功',
							type: 'success'
						})
						this.$emit('updatePage');
					} else {
						this.$refs.uToast.show({
							title: '评论出错,请登录',
							type: 'warning'
						})
					}
				})
			},
			// 点击操作菜单
			mySheetClick(index){
				if(index===0){
					this.isInput = 1;
					this.focus = 1;
				}else if(index===1){
					this.$u.api.deleteNewsCommentById({
						id:this.cid
					}).then(res => {
						if(res.msg==='删除成功'){
							this.$refs.uToast.show({
								title: '删除成功',
								type: 'success'
							})
							this.$emit('updatePage');
						}
					})
				}
			},
			otherSheetClick(index){
				if(index===0){
					this.isInput = 1;
					this.focus = 1;
				}else if(index===1){
					
				}
			},
		}
	}
</script>

<style lang="scss" scoped>
	.vfor {
		.item_wrap {
			display: flex;
			justify-content: space-between;
			margin-top: 20rpx;

			.left {
				display: flex;
				align-items: center;

				.avatar {}

				.nick {
					text {
						font-weight: bold;
						font-size: 37rpx;
						margin-left: 20rpx;
					}
				}

				.ptime {
					text {
						font-size: 27rpx;
						margin-left: 10rpx;
						color: #949494;
					}
				}
			}
		}

		.content {
			margin-left: 82rpx;
			font-size: 33rpx;
			width: 580rpx;
			display: flex;
			align-items: center;
			.reply_to{
				color: #45aaf2;
				margin-right: 10rpx;
			}
			.reply_content{
				
			}
		}
	}

	.commentInputView {
		width: 750rpx;
		height: 100rpx;
		background-color: #fff;
		border-top: 1rpx solid #eee;
		position: fixed;
		bottom: 0;
		display: flex;
		align-items: center;

		.inputView {
			margin: 30rpx 20rpx;
			background-color: #f4f4f4;
			height: 60rpx;
			width: 650rpx;
			border-radius: 30rpx;
			padding-left: 50rpx !important;
		}
	}
</style>

(2)父组件使用递归组件

注意:热门评论开始看,资讯详情页面的样式我就不贴了,免得大家看得脑嗡嗡的,同时,有些方法我也删了,因为不是这篇文章要讲述的内容,如果你有什么疑惑可以在评论区留言

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在uniapp微信小程序中实现无限级评论(vue递归组件+Java构建所有评论树状结构) 的相关文章

随机推荐

  • 【unity3D】DoTween动画插件(下)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于游戏开发的学习笔记 本篇是unity的DoTween动画插件可视化编辑 DoTween动画插件 可视化编辑 DOTween Animation DoTween Path路径编辑器 Sc
  • IBM Spectrum LSF Documentation

    原文链接 https www ibm com docs en spectrum lsf 10 1 0 topic o w 2 This is the IBM LSF online help documentation
  • java中request接收数组(即request接收多个同名参数)

    例如 复选框 勾选多个内容的时候 提交
  • 区块链对于实体经济将发挥什么样的作用

    区块链技术被誉为颠复时代的技术之一 有望推动整个实体经济的技术 框架 效率以及模式的变革 如此光环之下的区块链技术被给予厚望 也处于舆论的刀剑上 不论是区块链技术的何种应用被发掘 总能引起社会各界的广泛关注 以平和的角度去看区块链 不外乎就
  • IDEA 值得推荐的优秀插件分享

    IDEA可以说是目前市面上 比较好用的编程软件之一 想必各位程序大佬们也都有用过 这要得益于它炫酷的UI界面 强大的功能 以及可以下载丰富的插件 帮助我们编程开发 提升我们的工作效率等等 之前也有朋友和同事 询问我有没有好用的插件推荐 正好
  • docker快速学习--dockerfile--05

    一 Docker 镜像原理 1 1 操作系统组成部分 1 2 镜像原理 Docker镜像是由特殊的文件系统叠加而成 最底端是 bootfs 并使用宿主机的bootfs 第二层是 root文件系统rootfs 称为base image 然后再
  • 制作一个简单的网页(入门篇)

    使用HTML和CSS来制作一个简单的网页 前言 一 HTML 1 1常见元素介绍 1 2借助工具 浏览器开发者工具 二 实现个人名片 1 基本框架 2 使用CSS美化 1 CSS书写位置 1 以元素的style 属性来指定 内联样式 2 以
  • 快速排序递归实现和非递归实现(详解)

    内容 快速排序的递归 非递归实现代码及注解 思路详解 以及快速排序的优化 目录 快速排序的递归实现 基本思想 步骤 让基准值排序到最终位置 使得左右区间自然分割开的方法有如下三种 1 hoare版本 基本思想 编辑动图演示 一些细节 代码实
  • dvwa靶场Brute Force(暴力破解)全难度教程(附代码分析)

    建议使用owaspbwa靶场可以不用搭建dvwa以及其他常用靶场 省去搭建靶场的困扰 但是此靶机靶场较老 并不建议使用 owaspbwa下载地址 OWASP Broken Web Applications Project download
  • 【C++奇遇记】函数模板

    博客主页 博主链接 本文由 M malloc 原创 首发于 CSDN 学习专栏推荐 LeetCode刷题集 数据库专栏 初阶数据结构 欢迎点赞 收藏 留言 如有错误敬请指正 未来很长 值得我们全力奔赴更美好的生活 文章目录 本章详情 函数模
  • XML的生成和解析

    一 什么是XML XML就是可扩展标记语言 HTML是超文本标记语言 标记语言就是通过一个一个的标记来组织数据的一种语法格式 与HTMl超文本语言比较的话XML这种可扩展语言它的标记是自己定义的 XML中自己定义的标记表示 例如 lt 标记
  • 复杂网络博弈:WS、NW小世界网络模型

    用Matlab程序分别绘制含有至少100个节点的WS NW小世界网络模型 并给出具体程序代码 带每行注释 Matlab版本 matlab R2022b 代码1 自己不用去创建函数体 设置节点数量为100 N 100 设置平均度数为4 K 4
  • 如何编写jstl自定义标签(示例:自定义jstl Long型时间转为date型)

    原文地址 http www cnblogs com icoding archive 2012 07 08 2581164 html 写jsp不可避免的会用到jstl 因为这个公司也没怎么用过velocity等模板 所以jstl就相对来说是比
  • 幼儿园分班问题 【Java】

    幼儿园分班问题 Java 题目描述 幼儿园两个班的小朋友在排队时混在了一起 每位小朋友都知道自己是否与前面一位小朋友是否同班 请你帮忙把同班的小朋友找出来 小朋友的编号是整数 与前一位小朋友同班用Y表示 不同班用N表示 输入描述 输入由空格
  • LaTeX 宏包(\usepackage)

    LaTeX 宏包引用及常用宏包简介 LaTeX 宏包 宏包介绍 常用宏包简介 如何安装宏包 MiKTeX Console 宏包调用 LaTeX 宏包 宏包介绍 宏包是用来扩展 增强LaTeX的功能 宏包与LaTeX的关系和浏览器插件与浏览器
  • hbuilderX自定义主题仿vscode暗黑主题

    目录 hbuilderX自定义主题仿vscode暗黑主题 效果图 设置方式 把主题代码复制进来即可 是基于雅蓝主题自定义的 设置好后需要切换到雅蓝主题 hbuilderx保存时自动整理代码 1 首先在顶部栏 找到工具 打开设置 2 点击旁边
  • net::ERR_CONNECTION_RESET 报错原因

    1 gt 向tomcat 服务器上上传视频 谷歌浏览器控制台报出 打开信地址栏后 发现 net ERR CONNECTION RESET 错误 但是此视频以经过mp4转码 注 浏览器支持的播放mp4视频编码格式为 AVC编码的H264 后发
  • Unity 打包至Android 平台 编译不通过 所遇到过的坑

    Now we are here to learn how to build a android app by unity game engine but Build 不出来咋办 你都遇到了那些情况的问题呢 1 入门 忘记设置包名 2 安装A
  • Intellj idea 中创建测试 test

    在idea中创建测试类有两种方法 1 鼠标点中类名 使用 Alt Enter 会弹出intention action gt create tests 2 鼠标点中类名 使用 Ctrl Shift T 默认 会弹出 create new te
  • 在uniapp微信小程序中实现无限级评论(vue递归组件+Java构建所有评论树状结构)

    1 前言 这是本人毕业设计中其中一个功能点 就是用户在微信小程序 使用uniapp框架 中的首页模块中可以对健身资讯进行评论或者社区模块对别人发布的动态进行评论 2 实现效果 最后放个演示视频吧 实现思路 1 首先 在前端页面中编写好一个递