<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          Vue開發聊天界面

          2021-9-1    前端達人

          Vue開發聊天界面(一)

          最近業務里面有個需求就是開發一個類似微信的聊天頁面的H5,不需要像微信那么復雜,但是得有個樣子,弄了半天之后終于有了個樣子。決定寫個博客記一下這個過程,希望后續不會鴿

          組件拆分

          拆了3個,打字的聊天item,聊天list。大概就這樣了

          其中聊天list 用了一個better-scroll這個第三方插件。

          首先第一步就是開發這個聊天item

          聊天item 開發

          分析一下需求,別人發過來的和我們發過去的是兩個排版和樣式,但是不用單獨寫兩個,用個邏輯區分一下就可以了,也可以動態綁定css什么的差別很小。

          <template> <div class="record-wrapper"> <!-- 時間,后續開發 --> <div class="time"></div> <!-- 消息, msg通用樣式 msg-right/msg-left 區分排版左右 --> <div v-if="from == 1" class="msg msg-right"> <div class="img-wrapper"> <img class="img" :src="from1" /> </div> <!-- 消息框, msg通用樣式 message-wrapper-right/left 區分聊天框顏色 --> <div class="message-wrapper message-wrapper-right"> <div class="message">{{ message }}</div> </div> </div> </div> </template> 

          這個是只有1邊的,邏輯就是在消息那邊加個v-if,判斷來源,也可以動態綁定css

          弄好以后就這樣

          <template> <div class="record-wrapper"> <div class="time"></div> <div v-if="from == 1" class="msg msg-right"> <div class="img-wrapper"> <img class="img" :src="from1" /> </div> <div class="message-wrapper message-wrapper-right"> <div class="message">{{ message }}</div> </div> </div> <div v-else class="msg msg-left"> <div class="img-wrapper"> <img class="img" :src="from2" /> </div> <div class="message-wrapper message-wrapper-left"> <div class="message">{{ message }}</div> </div> </div> </div> </template> <script> export default {
            name: "",
            props: {
              from: Number, // 1: 自己    2: 別人
              message: String,
              timestamp: Date,
            },
            data() {
              return {
                from1: require("../../../assets/imgs/from1.jpg"),
                from2: require("../../../assets/imgs/from2.jpg"),
              };
            },
          }; </script> 

          個人覺得css還是比較重要的,這里用了sass來寫。主要解決方案就是用一個display:flex配合上flex-direction: row-reverse讓頭像和消息左右排列

          <style lang="scss" scoped> .record-wrapper { margin: 4px; padding: 4px; } .time { text-align: center; } .msg { display: flex; flex-direction: row; .message-wrapper { max-width: 220px; margin: 0px 10px 0px 10px; .message { margin: 8px; word-wrap: break-word; //英文換行 } } .message-wrapper-left { background-color: lightslategray; border-radius: 0px 12px 12px 12px; } .message-wrapper-right { background-color: powderblue; border-radius: 12px 0px 12px 12px; } .img { flex: auto; height: 36px; width: 36px; border-radius: 8px; } } .msg-right { flex-direction: row-reverse; } .msg-left { flex-direction: row; } </style> 

          這個是沒有調樣式的,只是為了自己嗨弄的,可能會很丑。
          最后大概就是這樣的

          Vue開發聊天界面(二)

          我開發好了一個聊天的item,可以根據發送方和接收方來分別渲染一個item,這一章我把他們放在一個list的界面里面,讓一串item構成一個聊天頁面,并且這個聊天頁面能夠上下滾動。

          其實我覺得很簡單,難點就2個。首先是滑動,這里用了better-scroll這個組件,可以在網上搜,挺好用的。另一個就是頁面布局的問題,寫點css還是沒得問題的。
          首先去better-scroll的官網,按著他的核心邏輯抄一下。不詳細談了,總之來說,會有三層嵌套。我個人命名他們為: wrapper 和content和 item 這三層。
          先弄一個json,當做會被填充的數據。

          export const chatItems = [ { type:1, message:"fdaf地方撒風大撒風阿斯頓飛fd阿斯頓飛安德森發大水發大水發大水奮斗發的大撒風安德森 發大發大水發", from:1, timestamp: new Date() }, { type:1, message:"fdaf地方撒風大撒aa風阿斯頓飛ffdsafsfadsfadsfjlkjsadflkosdajfl asdjlffsaf水奮斗發的大撒風安德森 發大發大水發", from:1, timestamp: new Date() }, { type:1, message:"做緊d咩嘢?", from:2, timestamp: new Date() }, { type:1, message:"???", from:2, timestamp: new Date() }, ] 

          然后開始寫vue的代碼

          <template> <div class="scroll-wrapper" ref="scroll"> <div class="scroll-content"> <chat-item v-for="item in chatItems" :key="item.message" :type="item.type" :message="item.message" :timestamp="item.timestamp" :from="item.from" ></chat-item> </div> </div> </template> <script> import BScroll from "@better-scroll/core";
          import MouseWheel from "@better-scroll/mouse-wheel"
          import ChatItem from "./ChatItem";
          import { chatItems } from "../../../assets/data/items";
          
          BScroll.use(MouseWheel)
          
          export default {
            name: "",
            data() {
              return {
                chatItems,
                bs: null
              };
            },
            components: {
              "chat-item": ChatItem,
            },
          
            mounted() {
              this.init();
            },
            beforeDestroy() {
              this.bs.destroy();
            },
            methods: {
              // better-scroll的代碼
              init() {
                this.bs = new BScroll(this.$refs.scroll, {
                  scrollY: true, // 上下滾動
                  click: true,   // 開啟點擊事件
                  startY: document.querySelector(".scroll-wrapper").clientHeight - this.$refs.scroll.scrollHeight + 5 , // 初始高度
                  mouseWheel: true,   // 鼠標滾動
                  probeType: 2, // listening scroll hook
                });
          
                // 下面的不要也行,官網抄的順便留下來了
                this.bs.on("scroll", ({ y }) => {
                  console.log("scrolling:" + y);
                });
                this.bs.on("scrollEnd", () => {
                  console.log("scrollingEnd");
                });
              },
              clickHandler(item) {
                alert(item);
              },
            },
          }; </script> <style lang="scss" scoped> .scroll-wrapper {
            height: calc(100% - 160px);  // 留一些空間給 打字的地方 和 header
            overflow: hidden;    // 非常之關鍵
          } </style> 

          最后是這個樣子的了

          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:簡書。作者:Good_Nine9

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務





          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合