国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

構建一個即時消息應用(九):Conversation頁面

開發 后端
在這篇文章中,我們將對對話conversation頁面進行編碼。此頁面是兩個用戶之間的聊天室。在頂部我們將顯示其他參與者的信息,下面接著的是最新消息列表,以及底部的消息表單。

[[347198]]

本文是該系列的第八篇。

在這篇文章中,我們將對對話conversation頁面進行編碼。此頁面是兩個用戶之間的聊天室。在頂部我們將顯示其他參與者的信息,下面接著的是最新消息列表,以及底部的消息表單。

聊天標題

 

讓我們從創建 static/pages/conversation-page.js 文件開始,它包含以下內容:

  1. import http from '../http.js' 
  2. import { navigate } from '../router.js' 
  3. import { avatar, escapeHTML } from '../shared.js' 
  4.  
  5. export default async function conversationPage(conversationID) { 
  6.     let conversation 
  7.     try { 
  8.         conversation = await getConversation(conversationID) 
  9.     } catch (err) { 
  10.         alert(err.message) 
  11.         navigate('/'true
  12.         return 
  13.     } 
  14.  
  15.     const template = document.createElement('template'
  16.     template.innerHTML = ` 
  17.         <div> 
  18.             <a href="/">← Back</a> 
  19.             ${avatar(conversation.otherParticipant)} 
  20.             <span>${conversation.otherParticipant.username}</span> 
  21.         </div> 
  22.         <!-- message list here --> 
  23.         <!-- message form here --> 
  24.     ` 
  25.     const page = template.content 
  26.     return page 
  27.  
  28. function getConversation(id) { 
  29.     return http.get('/api/conversations/' + id) 

此頁面接收路由從 URL 中提取的會話 ID。

首先,它向 /api/ conversations/{conversationID} 發起一個 GET 請求,以獲取有關對話的信息。 如果出現錯誤,我們會將其顯示,并重定向回 /。然后我們呈現有關其他參與者的信息。

對話列表

 

我們也會獲取最新的消息并顯示它們。

  1. let conversation, messages 
  2. try { 
  3.     [conversation, messages] = await Promise.all([ 
  4.         getConversation(conversationID), 
  5.         getMessages(conversationID), 
  6.     ]) 

更新 conversationPage() 函數以獲取消息。我們使用 Promise.all() 同時執行這兩個請求。

  1. function getMessages(conversationID) { 
  2.     return http.get(`/api/conversations/${conversationID}/messages`) 

發起對 /api/conversations/{conversationID}/messages 的 GET 請求可以獲取對話中的最新消息。

  1. <ol id="messages"></ol> 

現在,將該列表添加到標記中。

  1. const messagesOList = page.getElementById('messages'
  2. for (const message of messages.reverse()) { 
  3.     messagesOList.appendChild(renderMessage(message)) 

這樣我們就可以將消息附加到列表中了。我們以時間倒序來顯示它們。

  1. function renderMessage(message) { 
  2.     const messageContent = escapeHTML(message.content) 
  3.     const messageDate = new Date(message.createdAt).toLocaleString() 
  4.  
  5.     const li = document.createElement('li'
  6.     if (message.mine) { 
  7.         li.classList.add('owned'
  8.     } 
  9.     li.innerHTML = ` 
  10.         <p>${messageContent}</p> 
  11.         <time>${messageDate}</time
  12.     ` 
  13.     return li 

每個消息條目顯示消息內容本身及其時間戳。使用 .mine,我們可以將不同的 css 類附加到條目,這樣您就可以將消息顯示在右側。

消息表單

 

 
  1. <form id="message-form"
  2.     <input type="text" placeholder="Type something" maxlength="480" required> 
  3.     <button>Send</button> 
  4. </form> 

將該表單添加到當前標記中。

  1. page.getElementById('message-form').onsubmit = messageSubmitter(conversationID) 

將事件監聽器附加到 “submit” 事件。

  1. function messageSubmitter(conversationID) { 
  2.     return async ev => { 
  3.         ev.preventDefault() 
  4.  
  5.         const form = ev.currentTarget 
  6.         const input = form.querySelector('input'
  7.         const submitButton = form.querySelector('button'
  8.  
  9.         input.disabled = true 
  10.         submitButton.disabled = true 
  11.  
  12.         try { 
  13.             const message = await createMessage(input.value, conversationID) 
  14.             input.value = '' 
  15.             const messagesOList = document.getElementById('messages'
  16.             if (messagesOList === null) { 
  17.                 return 
  18.             } 
  19.  
  20.             messagesOList.appendChild(renderMessage(message)) 
  21.         } catch (err) { 
  22.             if (err.statusCode === 422) { 
  23.                 input.setCustomValidity(err.body.errors.content) 
  24.             } else { 
  25.                 alert(err.message) 
  26.             } 
  27.         } finally { 
  28.             input.disabled = false 
  29.             submitButton.disabled = false 
  30.  
  31.             setTimeout(() => { 
  32.                 input.focus() 
  33.             }, 0) 
  34.         } 
  35.     } 
  36.  
  37. function createMessage(content, conversationID) { 
  38.     return http.post(`/api/conversations/${conversationID}/messages`, { content }) 

我們利用 partial application 在 “submit” 事件處理程序中獲取對話 ID。它 從輸入中獲取消息內容,并用它對 /api/conversations/{conversationID}/messages 發出 POST 請求。 然后將新創建的消息添加到列表中。

消息訂閱

為了實現實時,我們還將訂閱此頁面中的消息流。

  1. page.addEventListener('disconnect', subscribeToMessages(messageArriver(conversationID))) 

將該行添加到 conversationPage() 函數中。

  1. function subscribeToMessages(cb) { 
  2.     return http.subscribe('/api/messages', cb) 
  3.  
  4. function messageArriver(conversationID) { 
  5.     return message => { 
  6.         if (message.conversationID !== conversationID) { 
  7.             return 
  8.         } 
  9.  
  10.         const messagesOList = document.getElementById('messages'
  11.         if (messagesOList === null) { 
  12.             return 
  13.  
  14.         } 
  15.         messagesOList.appendChild(renderMessage(message)) 
  16.         readMessages(message.conversationID) 
  17.     } 
  18.  
  19. function readMessages(conversationID) { 
  20.     return http.post(`/api/conversations/${conversationID}/read_messages`) 

在這里我們仍然使用這個應用的部分來獲取會話 ID。 當新消息到達時,我們首先檢查它是否來自此對話。如果是,我們會將消息條目預先添加到列表中,并向 /api/conversations/{conversationID}/read_messages 發起 POST 一個請求,以更新參與者上次閱讀消息的時間。


本系列到此結束。 消息應用現在可以運行了。

 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2020-10-16 14:40:20

即時消息Home頁面編程語言

2020-10-12 09:20:13

即時消息Access頁面編程語言

2020-10-09 12:45:19

創建消息即時消息編程語言

2019-09-29 15:25:13

CockroachDBGoJavaScript

2020-10-09 15:00:56

實時消息編程語言

2020-03-31 12:21:20

JSON即時消息編程語言

2019-10-28 20:12:40

OAuthGuard中間件編程語言

2020-10-10 20:51:10

即時消息編程語言

2023-08-14 08:01:12

websocket8g用戶

2021-03-25 08:29:33

SpringBootWebSocket即時消息

2025-06-30 01:45:00

Netty輪詢HTTP 協議

2015-03-18 15:37:19

社交APP場景

2014-10-15 11:01:02

Web應用測試應用

2018-08-22 17:32:45

2022-02-10 07:03:32

流量應用架構數據交換

2021-07-14 17:39:46

ReactRails API前端組件

2023-09-21 08:00:00

ChatGPT編程工具

2021-12-03 00:02:01

通訊工具即時

2023-09-15 10:10:05

R 語言

2010-05-24 09:51:37

System Cent
點贊
收藏

51CTO技術棧公眾號

亚洲性图自拍| aa视频在线观看| 精品一区二区三区视频| 国产91精品不卡视频| 国产精品蜜臀| 欧美综合视频在线观看| 免费av网页| 国产欧美一区二区三区沐欲| 视频一区免费观看| 98精品视频| 国产精品一区久久| 国内亚洲精品| 国产精品视频免费在线| 希岛爱理av免费一区二区| 国内精品久久久久久久| 精品国产麻豆| 欧美精品精品精品精品免费| 日韩亚洲国产免费| 亚洲欧美日韩中文在线制服| 国产桃色电影在线播放| 亚洲成人av片在线观看| 第一中文字幕在线| 日韩精品亚洲视频| 成人免费看黄| 色婷婷久久一区二区| 国产一区二区三区黄网站| 欧美激情区在线播放| 欧美精品国产白浆久久久久| 国产v综合ⅴ日韩v欧美大片 | 国产一区二区三区黄视频 | 91欧美大片| 91丨九色丨国产在线| 一区二区三区国产精华| 国产伦精品一区二区| 丝袜亚洲另类欧美| 日本久久久网站| 久久久久久久免费视频了| 岛国毛片在线播放| 无吗不卡中文字幕| 精品国产31久久久久久| 欧美电影院免费观看| 在线国产精品视频| 日本午夜免费一区二区| 日韩专区中文字幕| 精品伊人久久久| 国产精品入口日韩视频大尺度| 色乱码一区二区三区网站| 99精品99久久久久久宅男| 一本色道久久| 蜜臀av.com| 国产精品久久久久一区二区三区 | 欧美羞羞免费网站| 三级网站视频在在线播放| 日韩av中文字幕在线播放| 另类中文字幕国产精品| 国内精品美女av在线播放| 欧美精品情趣视频| 国产精品一区二区三区av麻 | 伊色综合久久之综合久久| 国产91在线高潮白浆在线观看 | 丝袜美腿亚洲一区二区图片| 51xx午夜影福利| 中文字幕一区二区在线观看| 久久电影中文字幕| 日韩国产在线播放| 窝窝社区一区二区| 蜜桃精品久久久久久久免费影院| 乱小说综合网站| 欧美日韩免费视频| 精品欧美日韩精品| 91视频-88av| 国产91精品一区二区| 粉嫩tv在线播放| 亚洲一区www| 水蜜桃精品av一区二区| 嫩草影院中文字幕| 在线观看视频欧美| 成人在线视频你懂的| 久久久久久久久久久久久9999| 久久这里只有精品首页| 青青草av免费在线观看| 日韩午夜在线视频| 亚洲国产免费看| 日本在线观看免费视频| 色婷婷综合久久久久中文一区二区 | 黄色一级视频在线播放| 亚洲国产精品精华液网站| 91av亚洲| 都市激情久久久久久久久久久| 成人黄色小视频在线观看| yourporn在线观看中文站| 欧美激情中文网| 国产在线不卡一卡二卡三卡四卡| 黑人巨大精品欧美一区二区奶水| 精品电影一区二区| 成人毛片在线| 亚洲 中文字幕 日韩 无码| 日韩欧美一级二级三级久久久| 青青一区二区| 人妻av中文系列| 亚洲精品在线网站| 日韩视频中文| 日本韩国一区| 欧美最猛性xxxxx免费| 国产黑丝在线一区二区三区| 麻豆影视在线观看_| 国产欧美一区二区三区视频 | 亚洲成人精品视频在线观看| 天天天综合网| 中文字幕www| 综合久久国产九一剧情麻豆| 中文字幕 91| 伊人久久久久久久久久久| 午夜在线视频观看日韩17c| av网站观看| 最近中文字幕日韩精品 | 亚洲精品白浆高清久久久久久| 国产成人精品999| 国产河南妇女毛片精品久久久| 素人av在线| 91免费电影网站| 日韩美女精品在线| 伊人久久大香线蕉综合影院首页| 天天综合色天天综合色hd| 欧洲一区在线观看| 91麻豆精品国产91久久久平台| 天天综合网日韩| 日韩亚洲国产中文字幕| 国产寡妇亲子伦一区二区| 亚洲一二三四| gogogo免费高清日本写真| 日韩三区免费| 国产视频一区二区视频| 国产成人一二三区| 不卡av免费观看| 噜噜爱69成人精品| 日本成人一区二区三区| 国产精品盗摄久久久| 亚洲男人的天堂在线观看| 欧美wwwsss9999| 偷窥自拍亚洲色图| 欧美一区二区三区精品电影| 亚洲天堂a在线| 国产探花一区二区| 一个人看的www一区| 亚洲专区在线视频| 欧美精品vⅰdeose4hd| 国产婷婷精品| 国产福利片在线观看| 一二三在线视频| 日韩中文字幕网址| 国产精品网友自拍| 天天躁日日躁狠狠躁欧美巨大小说| 男女污污的视频| 国产成人精品久久二区二区91| 亚洲1区2区3区4区| 亚洲女同另类| 天堂av资源在线观看| 国产玉足脚交久久欧美| 欧美激情中文字幕乱码免费| 国产精品热久久久久夜色精品三区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 久久人人97超碰精品888| 夜色激情一区二区| 好吊日精品视频| mm视频在线视频| 亚洲精品高清无码视频| 国产主播在线一区| 日韩精品中文字幕一区二区三区| 国产成人精品免费视频网站| 婷婷久久综合九色国产成人| 香港成人在线视频| 在这里有精品| 国产精品久久麻豆| 日韩一级二级| 少妇激情一区二区三区| 国产精品444| 欧美一区二区三区免费观看视频| 国产美女娇喘av呻吟久久| 6080成人| 亚洲视频tv| 国产精品后入内射日本在线观看| 精品电影一区| 都市激情亚洲综合| 97视频在线| 欧美日韩无遮挡| 韩国三级电影久久久久久| 欧美一区二区视频免费观看| 99精品久久只有精品| 久久久久美女| 欧美黄色三级| 国产在线91| 日本特黄a级片| 国产精品日韩一区二区三区| 日韩在线播放一区| 欧美在线啊v一区| 久久久久久久久久久久久夜| 黑人一区二区三区四区五区| aaa国产精品| 欧美aa在线观看|