自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

構(gòu)建一個即時消息應(yīng)用(八):Home 頁面

開發(fā) 后端
繼續(xù)前端部分,讓我們在本文中完成 home 頁面的開發(fā)。 我們將添加一個開始對話的表單和一個包含最新對話的列表。

[[346742]]

本文是該系列的第八篇。

繼續(xù)前端部分,讓我們在本文中完成 home 頁面的開發(fā)。 我們將添加一個開始對話的表單和一個包含最新對話的列表。

對話表單

轉(zhuǎn)到 static/ages/home-page.js 文件,在 HTML 視圖中添加一些標(biāo)記。

 
  1. <form id="conversation-form"
  2.     <input type="search" placeholder="Start conversation with..." required> 
  3. </form> 

將該表單添加到我們顯示 “auth user” 和 “logout” 按鈕部分的下方。

  1. page.getElementById('conversation-form').onsubmit = onConversationSubmit 

現(xiàn)在我們可以監(jiān)聽 “submit” 事件來創(chuàng)建對話了。

  1. import http from '../http.js' 
  2. import { navigate } from '../router.js' 
  3.  
  4. async function onConversationSubmit(ev) { 
  5.     ev.preventDefault() 
  6.  
  7.     const form = ev.currentTarget 
  8.     const input = form.querySelector('input'
  9.  
  10.     input.disabled = true 
  11.  
  12.     try { 
  13.         const conversation = await createConversation(input.value) 
  14.         input.value = '' 
  15.         navigate('/conversations/' + conversation.id) 
  16.     } catch (err) { 
  17.         if (err.statusCode === 422) { 
  18.             input.setCustomValidity(err.body.errors.username) 
  19.         } else { 
  20.             alert(err.message) 
  21.         } 
  22.         setTimeout(() => { 
  23.             input.focus() 
  24.         }, 0) 
  25.     } finally { 
  26.         input.disabled = false 
  27.     } 
  28.  
  29. function createConversation(username) { 
  30.     return http.post('/api/conversations', { username }) 

在提交時,我們使用用戶名對 /api/conversations 進行 POST 請求,并重定向到 conversation 頁面(用于下一篇文章)。

對話列表

還是在這個文件中,我們將創(chuàng)建 homePage() 函數(shù)用來先異步加載對話。

  1. export default async function homePage() { 
  2.     const conversations = await getConversations().catch(err => { 
  3.         console.error(err) 
  4.         return [] 
  5.     }) 
  6.     /*...*/ 
  7.  
  8. function getConversations() { 
  9.     return http.get('/api/conversations'

然后,在標(biāo)記中添加一個列表來渲染對話。

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

將其添加到當(dāng)前標(biāo)記的正下方。

  1. const conversationsOList = page.getElementById('conversations'
  2. for (const conversation of conversations) { 
  3.     conversationsOList.appendChild(renderConversation(conversation)) 

因此,我們可以將每個對話添加到這個列表中。

  1. import { avatar, escapeHTML } from '../shared.js' 
  2.  
  3. function renderConversation(conversation) { 
  4.     const messageContent = escapeHTML(conversation.lastMessage.content) 
  5.     const messageDate = new Date(conversation.lastMessage.createdAt).toLocaleString() 
  6.  
  7.     const li = document.createElement('li'
  8.     li.dataset['id'] = conversation.id 
  9.     if (conversation.hasUnreadMessages) { 
  10.         li.classList.add('has-unread-messages'
  11.     } 
  12.     li.innerHTML = ` 
  13.         <a href="/conversations/${conversation.id}"
  14.             <div> 
  15.                 ${avatar(conversation.otherParticipant)} 
  16.                 <span>${conversation.otherParticipant.username}</span> 
  17.             </div> 
  18.             <div> 
  19.                 <p>${messageContent}</p> 
  20.                 <time>${messageDate}</time
  21.             </div> 
  22.         </a> 
  23.     ` 
  24.     return li 

每個對話條目都包含一個指向?qū)υ掜撁娴逆溄?,并顯示其他參與者信息和最后一條消息的預(yù)覽。另外,您可以使用 .hasUnreadMessages 向該條目添加一個類,并使用 CSS 進行一些樣式設(shè)置。也許是粗體字體或強調(diào)顏色。

請注意,我們需要轉(zhuǎn)義信息的內(nèi)容。該函數(shù)來自于 static/shared.js 文件:

  1. export function escapeHTML(str) { 
  2.     return str 
  3.         .replace(/&/g, '&amp;'
  4.         .replace(/</g, '&lt;'
  5.         .replace(/>/g, '&gt;'
  6.         .replace(/"/g, '&quot;'
  7.         .replace(/'/g, '&#039;') 

這會阻止將用戶編寫的消息顯示為 HTML。如果用戶碰巧編寫了類似以下內(nèi)容的代碼:

<script>alert('lololo')</script>

這將非常煩人,因為該腳本將被執(zhí)行😅。所以,永遠記住要轉(zhuǎn)義來自不可信來源的內(nèi)容。

消息訂閱

最后但并非最不重要的一點,我想在這里訂閱消息流。

  1. const unsubscribe = subscribeToMessages(onMessageArrive) 
  2. page.addEventListener('disconnect', unsubscribe) 

在 homePage() 函數(shù)中添加這一行。

  1. function subscribeToMessages(cb) { 
  2.     return http.subscribe('/api/messages', cb) 

函數(shù) subscribe() 返回一個函數(shù),該函數(shù)一旦調(diào)用就會關(guān)閉底層連接。這就是為什么我把它傳遞給 “斷開連接”disconnect事件的原因;因此,當(dāng)用戶離開頁面時,事件流將被關(guān)閉。

  1. async function onMessageArrive(message) { 
  2.     const conversationLI = document.querySelector(`li[data-id="${message.conversationID}"]`) 
  3.     if (conversationLI !== null) { 
  4.         conversationLI.classList.add('has-unread-messages'
  5.         conversationLI.querySelector('a > div > p').textContent = message.content 
  6.         conversationLI.querySelector('a > div > time').textContent = new Date(message.createdAt).toLocaleString() 
  7.         return 
  8.     } 
  9.  
  10.     let conversation 
  11.     try { 
  12.         conversation = await getConversation(message.conversationID) 
  13.         conversation.lastMessage = message 
  14.     } catch (err) { 
  15.         console.error(err) 
  16.         return 
  17.     } 
  18.  
  19.     const conversationsOList = document.getElementById('conversations'
  20.     if (conversationsOList === null) { 
  21.         return 
  22.     } 
  23.  
  24.     conversationsOList.insertAdjacentElement('afterbegin', renderConversation(conversation)) 
  25.  
  26. function getConversation(id) { 
  27.     return http.get('/api/conversations/' + id) 

每次有新消息到達時,我們都會在 DOM 中查詢會話條目。如果找到,我們會將 has-unread-messages 類添加到該條目中,并更新視圖。如果未找到,則表示該消息來自剛剛創(chuàng)建的新對話。我們?nèi)プ鲆粋€對 /api/conversations/{conversationID} 的 GET 請求,以獲取在其中創(chuàng)建消息的對話,并將其放在對話列表的前面。


以上這些涵蓋了主頁的所有內(nèi)容 😊。 在下一篇文章中,我們將對 conversation 頁面進行編碼。

 

 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2020-10-12 09:20:13

即時消息Access頁面編程語言

2020-10-19 16:20:38

即時消息Conversatio編程語言

2020-10-09 12:45:19

創(chuàng)建消息即時消息編程語言

2019-09-29 15:25:13

CockroachDBGoJavaScript

2020-10-09 15:00:56

實時消息編程語言

2019-10-28 20:12:40

OAuthGuard中間件編程語言

2020-03-31 12:21:20

JSON即時消息編程語言

2020-10-10 20:51:10

即時消息編程語言

2021-03-25 08:29:33

SpringBootWebSocket即時消息

2023-08-14 08:01:12

websocket8g用戶

2015-03-18 15:37:19

社交APP場景

2014-10-15 11:01:02

Web應(yīng)用測試應(yīng)用

2018-08-22 17:32:45

2022-02-10 07:03:32

流量應(yīng)用架構(gòu)數(shù)據(jù)交換

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

2009-04-28 09:44:31

jQueryAjaxphp
點贊
收藏

51CTO技術(shù)棧公眾號