本文是本系列的第八篇。第1部分:模式第2部分:OAuth第3部分:对话第4部分:消息传递第5部分:实时消息传递第6部分:仅开发登录第7部分:访问页面在.我们将添加一个用于开始对话的表单和一个包含最新对话的列表。对话框表单转到static/ages/home-page.js文件以在HTML视图中添加一些标记。 ${messageContent}${conversation.otherParticipant}}p>

本文是本系列的第八篇。第1部分:模式第2部分:OAuth第3部分:对话第4部分:消息传递第5部分:实时消息传递第6部分:仅开发登录第7部分:访问页面在.我们将添加一个用于开始对话的表单和一个包含最新对话的列表。对话框表单转到static/ages/home-page.js文件以在HTML视图中添加一些标记。 ${messageContent}${conversation.otherParticipant}}p>${avatar(conversation.otherParticipant)}${conversation.otherParticipant.username}`returnli}每个对话条目都包含一个指向对话页面的链接,并显示其他参与者信息和最后一条消息的预览。或者,您可以使用.hasUnreadMessages向条目添加一个类,并使用CSS进行一些样式设置。也许它是粗体或强调色。请注意,我们需要转义消息的内容。这个函数来自static/shared.js文件:exportfunctionescapeHTML(str){returnstr.replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"').replace(/'/g,''')}这可以防止用户编写的消息显示为HTML。如果用户碰巧编写了如下代码:这将非常烦人,因为脚本将被执行😅。所以,永远记得转义Content.MessageSubscribe最后但同样重要的是,我想订阅这里的消息流。function.functionsubscribeToMessages(cb){returnhttp.subscribe('/api/messages',cb)}函数subscribe()返回一个函数,该函数一旦被调用,就会关闭底层连接。这就是为什么我将它传递给“断开连接”断开连接事件的原因;因此,当用户离开页面时,事件流将被关闭。asyncfunctiononMessageArrive(message){constconversationLI=document.querySelector(`li[data-id="${message.conversationID}"]`)if(conversationLI!==null){conversationLI.classList.add('有未读消息')conversationLI.querySelector('a>div>p').textContent=message.contentconversationLI.querySelector('a>div>time').textContent=newDate(message.createdAt).toLocaleString()return}letconversationtry{对话=awaitgetConversation(message.conversationID)conversation.lastMessage=message}catch(err){console.error(err)return}constconversationsOList=document.getElementById('conversations')if(conversationsOList===null){返回}conversationsOList.insertAdjacentElement('afterbegin',renderConversation(conversation))}functiongetConversation(id){returnhttp.get('/api/conversations/'+id)}每次新消息到达时,我们都会在DOM中查询对话条目。如果找到,我们将has-unread-messages类添加到条目中,并更新视图。如果未找到,则表示该消息来自刚刚创建的新对话。我们向/api/conversations/{conversationID}发出GET请求以获取创建消息的对话并将其放在对话列表的前面。这些涵盖了主页的所有内容😊。在下一篇文章中,我们将对对话页面进行编码。源代码