185 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			185 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | |||
|  |   <!-- 留言 --> | |||
|  |   <u-popup | |||
|  |     v-model="showPopup" | |||
|  |     mode="bottom" | |||
|  |     @close="closePopup" | |||
|  |     close-icon-color="#333" | |||
|  |     close-icon-pos="top-right" | |||
|  |     borderRadius="16" | |||
|  |     closeable | |||
|  |   > | |||
|  |     <view class="leave-message-container"> | |||
|  |       <view class="leave-message-title">留言</view> | |||
|  |       <view class="leave-message-content"> | |||
|  |         <textarea | |||
|  |           class="message-input" | |||
|  |           v-model="messageContent" | |||
|  |           placeholder="请输入留言,100字以内" | |||
|  |           maxlength="100" | |||
|  |           placeholder-style="color: #999999;" | |||
|  |           :disabled="loading" | |||
|  |         ></textarea> | |||
|  |       </view> | |||
|  |       <view class="message-buttons"> | |||
|  |         <u-button | |||
|  |           class="submit-btn" | |||
|  |           type="primary" | |||
|  |           @click="handleSubmit" | |||
|  |           :disabled="loading" | |||
|  |         > | |||
|  |           {{ loading ? "提交中..." : "提交" }} | |||
|  |         </u-button> | |||
|  |         <u-button | |||
|  |           class="cancel-btn" | |||
|  |           type="default" | |||
|  |           @click="closePopup" | |||
|  |           :disabled="loading" | |||
|  |         > | |||
|  |           取消 | |||
|  |         </u-button> | |||
|  |       </view> | |||
|  |     </view> | |||
|  |   </u-popup> | |||
|  | </template> | |||
|  | 
 | |||
|  | <script> | |||
|  | export default { | |||
|  |   name: "LeaveMessage", | |||
|  |   props: { | |||
|  |     show: { | |||
|  |       type: Boolean, | |||
|  |       default: false, | |||
|  |     }, | |||
|  |     teacher: { | |||
|  |       type: Object, | |||
|  |       default: () => null, | |||
|  |     }, | |||
|  |   }, | |||
|  |   data() { | |||
|  |     return { | |||
|  |       showPopup: false, | |||
|  |       messageContent: "", | |||
|  |       loading: false, | |||
|  |     }; | |||
|  |   }, | |||
|  |   watch: { | |||
|  |     show: { | |||
|  |       handler(newVal) { | |||
|  |         this.showPopup = newVal; | |||
|  |       }, | |||
|  |       immediate: true, | |||
|  |     }, | |||
|  |     showPopup(val) { | |||
|  |       if (val !== this.show) { | |||
|  |         this.$emit("update:show", val); | |||
|  |       } | |||
|  |     }, | |||
|  |   }, | |||
|  |   methods: { | |||
|  |     closePopup() { | |||
|  |       if (this.loading) return; // 如果正在提交,阻止关闭
 | |||
|  |       this.messageContent = ""; | |||
|  |       this.showPopup = false; | |||
|  |       this.$emit("update:show", false); | |||
|  |     }, | |||
|  |     handleSubmit() { | |||
|  |       if (this.loading) return; // 如果正在提交,阻止重复提交
 | |||
|  | 
 | |||
|  |       if (!this.messageContent.trim()) { | |||
|  |         uni.showToast({ | |||
|  |           title: "请输入留言内容", | |||
|  |           icon: "none", | |||
|  |         }); | |||
|  |         return; | |||
|  |       } | |||
|  | 
 | |||
|  |       // 模拟接口调用
 | |||
|  |       this.loading = true; | |||
|  |       uni.showLoading({ | |||
|  |         title: "提交中...", | |||
|  |       }); | |||
|  | 
 | |||
|  |       // 模拟网络请求延迟
 | |||
|  |       setTimeout(() => { | |||
|  |         // 模拟接口调用成功
 | |||
|  |         uni.hideLoading(); | |||
|  |         this.loading = false; | |||
|  | 
 | |||
|  |         // 发送留言内容和教师信息给父组件
 | |||
|  |         this.$emit("submit", { | |||
|  |           content: this.messageContent, | |||
|  |           teacher: this.teacher, | |||
|  |           success: true, | |||
|  |         }); | |||
|  | 
 | |||
|  |         // 成功提示
 | |||
|  |         uni.showToast({ | |||
|  |           title: "留言成功", | |||
|  |           icon: "success", | |||
|  |         }); | |||
|  | 
 | |||
|  |         // 清空留言内容
 | |||
|  |         this.messageContent = ""; | |||
|  |         // 关闭弹窗
 | |||
|  |         this.showPopup = false; | |||
|  |         this.$emit("update:show", false); | |||
|  |       }, 1500); // 模拟1.5秒的网络延迟
 | |||
|  |     }, | |||
|  |   }, | |||
|  | }; | |||
|  | </script> | |||
|  | 
 | |||
|  | <style lang="scss" scoped> | |||
|  | .leave-message-container { | |||
|  |   padding: 40rpx 0 0; | |||
|  |   background-color: #ffffff; | |||
|  |   border-radius: 16rpx; | |||
|  |   overflow: hidden; | |||
|  | 
 | |||
|  |   .leave-message-title { | |||
|  |     font-size: 32rpx; | |||
|  |     color: #333333; | |||
|  |     text-align: left; | |||
|  |     padding-left: 30rpx; | |||
|  |     margin-bottom: 30rpx; | |||
|  |     font-weight: 400; | |||
|  |   } | |||
|  | 
 | |||
|  |   .leave-message-content { | |||
|  |     padding: 0 30rpx; | |||
|  | 
 | |||
|  |     .message-input { | |||
|  |       width: 100%; | |||
|  |       height: 280rpx; | |||
|  |       background-color: #f5f5f5; | |||
|  |       border-radius: 16rpx; | |||
|  |       padding: 24rpx; | |||
|  |       font-size: 28rpx; | |||
|  |       box-sizing: border-box; | |||
|  |       color: #333333; | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   .message-buttons { | |||
|  |     padding: 30rpx 0; | |||
|  |     display: flex; | |||
|  |     justify-content: center; | |||
|  |     align-items: center; | |||
|  |     gap: 50rpx; | |||
|  | 
 | |||
|  |     .cancel-btn, | |||
|  |     .submit-btn { | |||
|  |       width: 156rpx; | |||
|  |       height: 70rpx; | |||
|  |       margin: 0; | |||
|  |       border-radius: 16rpx; | |||
|  |     } | |||
|  | 
 | |||
|  |     .submit-btn { | |||
|  |       background-color: #477bfb; | |||
|  |     } | |||
|  |   } | |||
|  | } | |||
|  | </style> |