效果图

代码
template
xml
<template>
<view>
<view class="comment-button" @click="isShowCommentDialog = true">
写评论
</view>
<!-- 遮罩层 -->
<view v-if="isShowCommentDialog" class="mask" @click="handleClose" ></view>
<!-- 弹窗主体 -->
<view v-if="isShowCommentDialog" class="dialog-container">
<view class="dialog-content">
<view class="title">请输入评论</view>
<!-- 评论输入框 -->
<textarea
v-model="commentContent"
class="comment-input"
placeholder="请输入您的宝贵意见(500字以内)"
:maxlength="500"
@input="handleInputChange"
/>
<!-- 清空按钮 -->
<view
class="clear-button"
v-if="commentContent.length > 0"
@click="commentContent = ''"
>
清空
</view>
<!-- 字数统计 -->
<view class="word-count">
{{ commentContent.length }}/500
</view>
<!-- 操作按钮组 -->
<view class="button-group">
<view
class="button cancel-button"
@click="handleClose"
>
取消
</view>
<view
class="button confirm-button"
:class="{ 'disabled': !commentContent.trim }"
@click="handleSubmit"
>
确认提交
</view>
</view>
</view>
</view>
</view>
</template>
script
xml
<script>
export default {
data() {
return {
// 弹窗显示状态
isShowCommentDialog: false,
// 评论内容
commentContent: '',
}
},
methods: {
// 输入内容变化处理
handleInputChange() {
// 可在此处添加输入格式校验逻辑
},
// 提交评论
handleSubmit() {
if (this.commentContent.trim) {
// 提交逻辑(示例:打印到控制台)
console.log('提交的评论内容:', this.commentContent)
this.handleClose
}
},
// 关闭弹窗
handleClose() {
this.isShowCommentDialog = false
// this.commentContent = ''
}
}
}
</script>
style
xml
<style>
.comment-button {
padding: 10rpx 20rpx;
background-color: #409eff;
color: #fff;
border-radius: 10rpx;
text-align: center;
margin: 20rpx;
}
.mask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 998;
}
.dialog-container {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 80%;
max-width: 500rpx;
background-color: #fff;
border-radius: 20rpx;
z-index: 999;
animation: dialogSlide 0.3s ease-out;
}
@keyframes dialogSlide {
from { opacity: 0; transform: translate(-50%, -40%); }
to { opacity: 1; transform: translate(-50%, -50%); }
}
.dialog-content {
padding: 30rpx;
position: relative;
}
.title {
font-size: 32rpx;
font-weight: bold;
margin-bottom: 20rpx;
text-align: center;
}
.comment-input {
width: 100%;
height: 200rpx;
padding: 20rpx;
border: 1px solid #e5e5e5;
border-radius: 10rpx;
font-size: 28rpx;
box-sizing: border-box;
}
.clear-button {
position: absolute;
right: 80rpx;
top: 50%;
transform: translateY(-50%);
color: #999;
font-size: 24rpx;
padding: 10rpx;
border: 1rpx solid #f5f5f5;
}
.word-count {
text-align: right;
color: #999;
margin: 10rpx 0;
font-size: 24rpx;
}
.button-group {
display: flex;
justify-content: space-between;
margin-top: 20rpx;
}
.button {
flex: 1;
padding: 15rpx 0;
border-radius: 10rpx;
text-align: center;
font-size: 28rpx;
transition: all 0.2s;
}
.cancel-button {
background-color: #f5f5f5;
color: #666;
}
.confirm-button {
background-color: #409eff;
color: #fff;
}
.confirm-button.disabled {
background-color: #999;
cursor: not-allowed;
}
</style>