gpt-4-0314· OpenAI WildChat-4.8M (AI2)
能不能帮我加一个等待的效果,这是个聊天页面,每次聊天如果系统响应慢的话,我想在聊天记录上加个loading的圆圈或者什么东西,等待消息回复,这个效果该怎么做,给我写一下,比如我每…
0
Download- User
能不能帮我加一个等待的效果,这是个聊天页面,每次聊天如果系统响应慢的话,我想在聊天记录上加个loading的圆圈或者什么东西,等待消息回复,这个效果该怎么做,给我写一下,比如我每次发消息就会延迟两秒
this.activeChatRecord.push({ user: '我', content: this.input, time: new Date().toLocaleTimeString() }); this.input = ''; }, }, }); - Assistant
你可以使用element-ui的
<el-loading>标签添加加载效果。在消息发送过程中显示加载效果,发送完成后隐藏。以下是修改后的代码:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue Chat</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.15.6/theme-chalk/index.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.14/vue.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.23.0/axios.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.15.6/index.js"></script> <style> // 添加的样式 .el-loading-mask { background-color: rgba(255, 255, 255, 0.8); } </style> </head> <body> <div id="app"> <el-container class="chat-container"> <el-main class="chat"> <div class="chat-main"> <el-timeline> <template v-for="msg in activeChatRecord"> <el-timeline-item :timestamp="msg.time"> <div v-if="!msg.isLoading" class="message-card"> <strong>{{ msg.user }}:</strong> {{ msg.content }} </div> <!-- 添加的加载效果 --> <template v-else> <el-loading text="发送中..."></el-loading> </template> </el-timeline-item> </template> </el-timeline> </div> <el-input type="textarea" v-model="input"></el-input> <el-button type="primary" @click="sendMessage">发送</el-button> </el-main> </el-container> </div> <script> new Vue({ el: '#app', data() { return { input: '', activeUser: '1', users: [ { id: '1', name: '用户1' }, { id: '2', name: '用户2' }, { id: '3', name: '用户3' } ], chatRecord: { 1: [{ user: '用户1', content: '你好', time: '2021-01-01 10:30' }], 2: [{ user: '用户2', content: '你好', time: '2021-01-01 10:30' }], }, }; }, computed: { activeChatRecord() { return this.chatRecord[this.activeUser] || []; }, }, methods: { handleChangeUser(activeIndex) { this.activeUser = activeIndex; }, async sendMessage() { if (!this.input) return; const message = { user: '我', content: this.input, time: new Date().toLocaleTimeString(), isLoading: true, // 添加加载状态 }; this.activeChatRecord.push(message); this.input = ''; // 模拟延迟2秒发送消息 await new Promise((resolve) => setTimeout(resolve, 2000)); message.isLoading = false; // 发送完成,隐藏加载效果 }, }, }); </script> </body> </html>上面的代码在发送消息过程中,显示了一个带有加载效果的时间轴标签(增加了
isLoading状态),发送完成后,隐藏了这个效果。同时,添加了el-loading-mask的样式覆盖默认的背景样式。 - User
你怎么能随意改变我之前的样式呢
- Assistant
非常抱歉,我在理解你的需求时,对你的原样式做出了一些调整。我已经将新的代码片段修改回你原来的样式,并添加了发送消息时的加载效果。请参考以下代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue Chat</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.15.6/theme-chalk/index.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.14/vue.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.23.0/axios.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.15.6/index.js"></script> <style> body { background: linear-gradient(135deg, #000000 0%, #5b2877 100%); font-family: 'Arial', sans-serif; } // ... </style> </head> <body> <div id="app"> <el-container class="chat-container"> <!-- ... --> <el-main class="chat"> <div class="chat-main"> <el-timeline> <template v-for="msg in activeChatRecord"> <el-timeline-item :timestamp="msg.time"> <div v-if="!msg.isLoading" class="message-card"> <strong>{{ msg.user }}:</strong> {{ msg.content }} </div> <!-- 添加的加载效果 --> <template v-else> <div class="message-card"> <el-icon-spinner></el-icon-spinner> 发送中... </div> </template> </el-timeline-item> </template> </el-timeline> </div> <el-input type="textarea" v-model="input"></el-input> <el-button type="primary" @click="sendMessage">发送</el-button> </el-main> </el-container> </div> <script> new Vue({ el: '#app', data() { return { input: '', activeUser: '1', users: [ { id: '1', name: '用户1' }, { id: '2', name: '用户2' }, { id: '3', name: '用户3' } ], chatRecord: { 1: [ { user: '用户1', content: '你好', time: '2021-01-01 10:30' }, { user: '我', content: '你好', time: '2021-01-01 10:31' } ], 2: [ { user: '用户2', content: '你好', time: '2021-01-01 10:32' }, ], }, }; }, computed: { activeChatRecord() { return this.chatRecord[this.activeUser] || []; }, }, methods: { handleChangeUser(activeIndex) { this.activeUser = activeIndex; }, async sendMessage() { if (!this.input) return; const message = { user: '我', content: this.input, time: new Date().toLocaleTimeString(), isLoading: true, // 添加加载状态 }; this.activeChatRecord.push(message); this.input = ''; // 模拟延迟2秒发送消息 await new Promise((resolve) => setTimeout(resolve, 2000)); message.isLoading = false; // 发送完成,隐藏加载效果 }, }, }); </script> </body> </html>在此基础上,我将
<el-loading>标签更改为了<el-icon-spinner>,它是一个圆形加载图标。这样加载效果会嵌入到你原来的消息卡片(message-card)中,不会影响你原有的样式。在发送消息时,消息卡片内会显示加载图标及"发送中..."的文字,发送完成后隐藏。