欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

構(gòu)建一個(gè)即時(shí)消息應(yīng)用之實(shí)現(xiàn)Home頁面

這篇文章主要介紹“構(gòu)建一個(gè)即時(shí)消息應(yīng)用之實(shí)現(xiàn)Home頁面”,在日常操作中,相信很多人在構(gòu)建一個(gè)即時(shí)消息應(yīng)用之實(shí)現(xiàn)Home頁面問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”構(gòu)建一個(gè)即時(shí)消息應(yīng)用之實(shí)現(xiàn)Home頁面”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站制作、漣源網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開發(fā)、漣源網(wǎng)絡(luò)營銷、漣源企業(yè)策劃、漣源品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供漣源建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:aaarwkj.com

對話表單

構(gòu)建一個(gè)即時(shí)消息應(yīng)用之實(shí)現(xiàn)Home頁面

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

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

將該表單添加到我們顯示 “auth user” 和 “l(fā)ogout” 按鈕部分的下方。

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

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

import http from '../http.js' import { navigate } from '../router.js'  async function onConversationSubmit(ev) {     ev.preventDefault()      const form = ev.currentTarget     const input = form.querySelector('input')      input.disabled = true      try {         const conversation = await createConversation(input.value)         input.value = ''         navigate('/conversations/' + conversation.id)     } catch (err) {         if (err.statusCode === 422) {             input.setCustomValidity(err.body.errors.username)         } else {             alert(err.message)         }         setTimeout(() => {             input.focus()         }, 0)     } finally {         input.disabled = false     } }  function createConversation(username) {     return http.post('/api/conversations', { username }) }

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

對話列表

構(gòu)建一個(gè)即時(shí)消息應(yīng)用之實(shí)現(xiàn)Home頁面

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

export default async function homePage() {     const conversations = await getConversations().catch(err => {         console.error(err)         return []     })     /*...*/ }  function getConversations() {     return http.get('/api/conversations') }

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

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

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

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

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

import { avatar, escapeHTML } from '../shared.js'  function renderConversation(conversation) {     const messageContent = escapeHTML(conversation.lastMessage.content)     const messageDate = new Date(conversation.lastMessage.createdAt).toLocaleString()      const li = document.createElement('li')     li.dataset['id'] = conversation.id     if (conversation.hasUnreadMessages) {         li.classList.add('has-unread-messages')     }     li.innerHTML = `         <a href="/conversations/${conversation.id}">             <div>                 ${avatar(conversation.otherParticipant)}                 <span>${conversation.otherParticipant.username}</span>             </div>             <div>                 <p>${messageContent}</p>                 <time>${messageDate}</time>             </div>         </a>     `     return li }

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

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

export function escapeHTML(str) {     return str         .replace(/&/g, '&amp;')         .replace(/</g, '&lt;')         .replace(/>/g, '&gt;')         .replace(/"/g, '&quot;')         .replace(/'/g, '&#039;') }

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

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

這將非常煩人,因?yàn)樵撃_本將被執(zhí)行?。所以,永遠(yuǎn)記住要轉(zhuǎn)義來自不可信來源的內(nèi)容。

消息訂閱

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

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

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

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

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

async function onMessageArrive(message) {     const conversationLI = document.querySelector(`li[data-id="${message.conversationID}"]`)     if (conversationLI !== null) {         conversationLI.classList.add('has-unread-messages')         conversationLI.querySelector('a > div > p').textContent = message.content         conversationLI.querySelector('a > div > time').textContent = new Date(message.createdAt).toLocaleString()         return     }      let conversation     try {         conversation = await getConversation(message.conversationID)         conversation.lastMessage = message     } catch (err) {         console.error(err)         return     }      const conversationsOList = document.getElementById('conversations')     if (conversationsOList === null) {         return     }      conversationsOList.insertAdjacentElement('afterbegin', renderConversation(conversation)) }  function getConversation(id) {     return http.get('/api/conversations/' + id) }

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

到此,關(guān)于“構(gòu)建一個(gè)即時(shí)消息應(yīng)用之實(shí)現(xiàn)Home頁面”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

本文標(biāo)題:構(gòu)建一個(gè)即時(shí)消息應(yīng)用之實(shí)現(xiàn)Home頁面
當(dāng)前URL:http://aaarwkj.com/article44/gpjoee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、企業(yè)網(wǎng)站制作、網(wǎng)站維護(hù)、網(wǎng)站設(shè)計(jì)公司、微信公眾號(hào)、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
五月婷婷六月丁香激情视频| 蜜桃传媒18传媒在线| 欧美欧美一区二区三区| 亚洲激情一区在线观看| 日韩无遮挡免费在线观看| 欧美精品一区二区网站| 国产高清不卡午夜福利| 日韩在线不卡一二三| 韩国福利短片在线观看| 欧美日韩三级国产在线| 日韩新片一区二区三区| av在线免费观看青青草原| 日韩少妇人妻一区二区| 国产精品一级片一区二区| 九九视频精品免费高清视频| 欧美av在线免费观看| 亚洲码av一区二区三区| 日本一区二区三区视频版| 日韩高清在线一区二区三区| 99久久中文字幕伊人| 乱色精品熟女一区二区三区| 欧美久久久久综合一区| 日韩久久精品免费视频| 漂亮人妻少妇中文字幕| 日韩久久这里只有精品视频| 国产成人精品久久久亚洲| 午夜美女精品福利视频| 日韩中文字幕免费一区二区| 啊啊舒服爽用力爱我视频| 黄片在线免费在线播放| 国产精品九九久久精品三级| av中文字幕啊嗯不要| 国产极白丝白浆日本国产| 欧美日韩福利一区二区三区| 91精品人妻互换一区二区| 熟女人妻丰满视频中文字幕| 国产精品综合久久蜜臀av| 中文字幕在线五月婷婷| 欧美亚洲午夜精品久久久| 欧美丝袜熟女日韩亚洲| 欧美日韩在线视频一区|