<template>
|
|
<view class="commemt">
|
|
<view class="comment-list">
|
|
<commentItem v-for="(item, index) in list" :key="index" :parentId="item.id" :sourceType="params.type"
|
|
:sourceId="params.orderId" :item="item" :subComments="getSubComments(item.id)"
|
|
@loadSubComments="handleLoadSubComments" @reply="handleReply" />
|
|
</view>
|
|
|
|
<view class="submit-box">
|
|
<view class="top">
|
|
<button class="share" open-type="share">
|
|
<uv-icon color="#00cf05" size="50rpx" name="weixin-fill"></uv-icon>
|
|
</button>
|
|
|
|
<input type="text" disabled @click="openCommentPublish"
|
|
:placeholder="'评论给' + params.name || '他'" />
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 评论发布组件 -->
|
|
<commentPublish ref="commentPublish" :params="params" :placeholder="'评论给' + params.name || '他'" @success="handleCommentSuccess" />
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import commentItem from './commentItem.vue'
|
|
import commentPublish from './commentPublish.vue'
|
|
|
|
export default {
|
|
components: {
|
|
commentItem,
|
|
commentPublish,
|
|
},
|
|
props: ['list', 'params'],
|
|
data() {
|
|
return {
|
|
currentReplyComment: null, // 当前回复的评论
|
|
subCommentsMap: {} // 存储子评论数据的映射表,key为父评论ID,value为子评论数组
|
|
}
|
|
},
|
|
methods: {
|
|
// 获取指定父评论的子评论列表
|
|
getSubComments(parentId) {
|
|
return this.subCommentsMap[parentId] || [];
|
|
},
|
|
|
|
// 打开评论发布弹窗
|
|
openCommentPublish() {
|
|
this.currentReplyComment = null
|
|
this.$refs.commentPublish.open()
|
|
},
|
|
|
|
// 评论发布成功回调
|
|
handleCommentSuccess(successData) {
|
|
console.log('handleCommentSuccess 接收到的数据:', successData);
|
|
|
|
// 如果是回复评论,需要重新加载对应的子评论列表
|
|
if (successData && successData.isReply && successData.parentId) {
|
|
console.log('准备重新加载子评论,parentId:', successData.parentId);
|
|
// 重新加载子评论数据
|
|
this.loadSubCommentsData(successData.parentId);
|
|
} else {
|
|
console.log('不是回复评论或缺少parentId,successData:', successData);
|
|
}
|
|
|
|
// 触发父组件刷新主评论列表
|
|
this.$emit('getData')
|
|
},
|
|
|
|
// 处理加载子评论
|
|
handleLoadSubComments(comment) {
|
|
// 模拟加载子评论数据的API调用
|
|
this.loadSubCommentsData(comment.id);
|
|
},
|
|
|
|
// 加载子评论数据
|
|
async loadSubCommentsData(parentId) {
|
|
try {
|
|
// 显示加载提示
|
|
uni.showLoading({
|
|
title: '加载中...'
|
|
});
|
|
|
|
const apiParams = {
|
|
pid: parentId,
|
|
type: this.params.type,
|
|
orderId: this.params.orderId,
|
|
page: 1,
|
|
pageSize: 99999999
|
|
};
|
|
|
|
// 使用实际的API获取子评论数据
|
|
this.$api('getCommentPage', apiParams, res => {
|
|
uni.hideLoading();
|
|
if (res.code === 200) {
|
|
// 将子评论数据存储到映射表中
|
|
const subComments = res.result.records || [];
|
|
this.$set(this.subCommentsMap, parentId, subComments);
|
|
}
|
|
});
|
|
|
|
} catch (error) {
|
|
uni.hideLoading();
|
|
}
|
|
},
|
|
|
|
// 处理回复评论
|
|
handleReply({item, level}) {
|
|
let comment = item
|
|
this.currentReplyComment = comment
|
|
|
|
// 判断是一级评论还是二级评论
|
|
let replyParams
|
|
let parentCommentId // 用于标识真正的父评论ID(一级评论ID)
|
|
|
|
if (comment.pid && comment.pid !== 0) {
|
|
// 这是二级评论,回复二级评论时仍然使用原始一级评论的ID作为pid
|
|
parentCommentId = comment.pid // 二级评论的pid就是一级评论的ID
|
|
replyParams = {
|
|
...this.params,
|
|
pid: comment.pid, // 使用原始一级评论的ID
|
|
parentCommentId: parentCommentId // 添加父评论ID用于更新子评论列表
|
|
}
|
|
if (level == 0) {
|
|
}else{
|
|
replyParams.replyToId = comment.replyToId
|
|
replyParams.replyToName = comment.userName
|
|
replyParams.replyToAvatar = comment.userHead
|
|
}
|
|
} else {
|
|
// 这是一级评论,回复一级评论时使用该评论的ID作为pid
|
|
parentCommentId = comment.id // 一级评论的ID就是父评论ID
|
|
replyParams = {
|
|
...this.params,
|
|
pid: comment.id, // 使用一级评论的ID作为pid
|
|
replyToId: comment.id,
|
|
replyToName: comment.userName,
|
|
replyToAvatar: comment.userHead,
|
|
parentCommentId: parentCommentId // 添加父评论ID用于更新子评论列表
|
|
}
|
|
}
|
|
|
|
this.$refs.commentPublish.setReplyParams(replyParams)
|
|
this.$refs.commentPublish.open()
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.commemt {
|
|
padding-bottom: env(safe-area-inset-bottom);
|
|
}
|
|
|
|
.comment-list {
|
|
margin-top: 20rpx;
|
|
padding-bottom: 150rpx;
|
|
}
|
|
|
|
.submit-box {
|
|
position: fixed;
|
|
bottom: 0;
|
|
left: 0;
|
|
background-color: #fff;
|
|
width: 100%;
|
|
box-shadow: 0 0 6rpx 6rpx #00000011;
|
|
padding-bottom: env(safe-area-inset-bottom);
|
|
|
|
.top {
|
|
align-items: center;
|
|
display: flex;
|
|
justify-content: center;
|
|
|
|
input {
|
|
background-color: #f3f3f3;
|
|
width: 460rpx;
|
|
height: 40rpx;
|
|
border-radius: 40rpx;
|
|
margin: 20rpx;
|
|
padding: 20rpx 30rpx;
|
|
font-size: 28rpx;
|
|
}
|
|
}
|
|
}
|
|
</style>
|