<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用 Go 和 ReactJS 構(gòu)建聊天系統(tǒng)(五):優(yōu)化前端

          共 3530字,需瀏覽 8分鐘

           ·

          2021-01-16 20:06

          點擊上方藍色“Go語言中文網(wǎng)”關(guān)注,每天一起學 Go

          本節(jié)完整代碼:GitHub[1]

          本文是關(guān)于使用 ReactJS ?和 Go 構(gòu)建聊天應用程序的系列文章的第 5 部分。你可以在這里找到第 4 部分 - 處理多個客戶端[2]

          歡迎來到本系列的第 5 部分!如果你已經(jīng)學到這兒了,那么我希望你享受學習 Go 的樂趣并運用 Go 和 React 建立自己的聊天系統(tǒng)!

          在本節(jié)中,我們將再次關(guān)注前端,并對其進行優(yōu)化,以便可以輸入自定義的聊天消息,并且以更好的方式顯示新的聊天消息。

          聊天輸入組件

          我們需要創(chuàng)建一個新的組件。該組件基本上只渲染 的內(nèi)容,然后監(jiān)聽 onKeyDown 事件(譯者注:onkeydown 事件會在用戶按下鍵盤按鍵時觸發(fā))。當用戶在 元素內(nèi)按鍵時,它將觸發(fā) onKeyDown 事件的函數(shù)。

          import?React,?{?Component?}?from?"react";
          import?"./ChatInput.scss";

          class?ChatInput?extends?Component?{
          ?render()?{
          ??return?(
          ???<div?className="ChatInput">
          ????<input?onKeyDown={this.props.send}?/>
          ???div>

          ??);
          ?}
          }

          export?default?ChatInput;

          然后,我們將為新的輸入組件定義一些樣式:

          .ChatInput?{
          ?width:?95%;
          ?display:?block;
          ?margin:?auto;

          ?input?{
          ??padding:?10px;
          ??margin:?0;
          ??font-size:?16px;
          ??border:?none;
          ??border-radius:?5px;
          ??border:?1px?solid?rgba(0,?0,?0,?0.1);
          ??width:?98%;
          ??box-shadow:?0?5px?15px?-5px?rgba(0,?0,?0,?0.1);
          ?}
          }

          定義了組件和樣式,現(xiàn)在只需要導出它。

          import?ChatInput?from?"./ChatInput.jsx";

          export?default?ChatInput;

          更新 App.js

          我們創(chuàng)建了 ChatInput 組件,現(xiàn)在需要更新 App.js,以便它使用新組件并將已經(jīng)定義的 send() 函數(shù)傳遞給該組件。

          render()?{
          ?return?(
          ??<div?className="App">
          ???<Header?/>
          ???<ChatHistory?chatHistory={this.state.chatHistory}?/>
          ???<ChatInput?send={this.send}?/>
          ??div>

          ?);
          }

          我們已經(jīng)傳入了定義的 send() 函數(shù),該函數(shù)現(xiàn)在只是向 WebSocket 端點發(fā)送一個簡單的 “Hello” 字符串。我們需要修改它,以便接收觸發(fā)它的事件的上下文。

          通過傳遞這個事件,我們將能夠查詢按下的鍵是否是 Enter 鍵,如果是,我們將 字段的值發(fā)送到 WebSocket 端點,然后清除

          send(event)?{
          ?if(event.keyCode?===?13)?{
          ??sendMsg(event.target.value);
          ??event.target.value?=?"";
          ?}
          }

          測試

          現(xiàn)在已經(jīng)創(chuàng)建了 ChatInput 組件,我們來運行 Go WebSocket 服務和前端,嘗試發(fā)送一些自定義消息,看看是否都按預期工作。

          優(yōu)化聊天記錄組件

          現(xiàn)在,我們有一個相當丑陋但功能正常的聊天記錄界面,它顯示從 WebSocket 服務向連接的客戶端廣播的每一條消息。

          這條消息只是以 JSON 格式顯示,沒有額外的樣式,所以現(xiàn)在讓我們看一下通過創(chuàng)建另一個 Message 組件來優(yōu)化它。

          Message 組件

          我們先定義 Message.jsx 文件。該組件將通過 ?prop 展示接收的消息。然后它將解析成名為 messageprop,并將其存儲在組件狀態(tài)中,然后我們可以在 render 函數(shù)中使用它。

          //?src/components/Message/Message.jsx
          import?React,?{?Component?}?from?"react";
          import?"./Message.scss";

          class?Message?extends?Component?{
          ?constructor(props)?{
          ??super(props);
          ??let?temp?=?JSON.parse(this.props.message);
          ??this.state?=?{
          ???message:?temp
          ??};
          ?}

          ?render()?{
          ??return?<div?className="Message">{this.state.message.body}div>;
          ?}
          }

          export?default?Message;

          跟之前一樣,我們還需要定義一個 index.js 文件,以使其在項目的其余部分中可導出:

          //?src/components/Message/index.js
          import?Message?from?"./Message.jsx";

          export?default?Message;

          到此為止,我們的組件樣式還是比較基本的,只是在一個框中顯示消息,我們再設置一些 box-shadow,使聊天界面有點視覺深度。

          .Message?{
          ?display:?block;
          ?background-color:?white;
          ?margin:?10px?auto;
          ?box-shadow:?0?5px?15px?-5px?rgba(0,?0,?0,?0.2);
          ?padding:?10px?20px;
          ?border-radius:?5px;
          ?clear:?both;

          ?&.me?{
          ??color:?white;
          ??float:?right;
          ??background-color:?#328ec4;
          ?}
          }

          更新歷史聊天記錄組件

          創(chuàng)建好了 Message 組件,我們現(xiàn)在可以在 ChatHistory 組件中使用它。我們需要更新 render() 函數(shù),如下所示:

          render()?{
          ?console.log(this.props.chatHistory);
          ?const?messages?=?this.props.chatHistory.map(msg?=>?<Message?message={msg.data}?/>);

          ?return?(
          ??<div?className='ChatHistory'>
          ???<h2>Chat?Historyh2>

          ???{messages}
          ??div>
          ?);
          };

          在第 3 行,可以看到已更新的 .map 函數(shù)返回 組件,并將消息 prop 設置為 msg.data。隨后會將 JSON 字符串傳遞給每個消息組件,然后它將能夠按照自定義的格式解析和展示它。

          現(xiàn)在我們可以看到,每當我們從 WebSocket 端點收到新消息時,它就會在 ChatHistory 組件中很好地展示出來!

          下一節(jié):Part 6 - Docker 部署[3]


          via: https://tutorialedge.net/projects/chat-system-in-go-and-react/part-5-improved-frontend/

          作者:Elliot Forbes[4]譯者:咔嘰咔嘰[5]校對:polaris1119[6]

          本文由 GCTT[7] 原創(chuàng)編譯,Go 中文網(wǎng)[8] 榮譽推出

          參考資料

          [1]

          GitHub: https://github.com/watermelo/realtime-chat-go-react/tree/part-5

          [2]

          處理多個客戶端: https://studygolang.com/articles/22430

          [3]

          Docker 部署: https://studygolang.com/articles/22434

          [4]

          Elliot Forbes: https://twitter.com/elliot_f

          [5]

          咔嘰咔嘰: https://github.com/watermelo

          [6]

          polaris1119: https://github.com/polaris1119

          [7]

          GCTT: https://github.com/studygolang/GCTT

          [8]

          Go 中文網(wǎng): https://studygolang.com/



          推薦閱讀


          福利

          我為大家整理了一份從入門到進階的Go學習資料禮包,包含學習建議:入門看什么,進階看什么。關(guān)注公眾號 「polarisxu」,回復 ebook 獲取;還可以回復「進群」,和數(shù)萬 Gopher 交流學習。


          瀏覽 18
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩无码中文字幕 | 色婷婷综合在线观看 | 亚洲日韩Av无码中文字幕美国 | 免费黄色电影在线观看 | 日日夜夜人人爽 |