亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Vue實(shí)現(xiàn)聊天界面

瀏覽:70日期:2022-09-28 15:19:59

本文實(shí)例為大家分享了Vue實(shí)現(xiàn)聊天界面展示的具體代碼,供大家參考,具體內(nèi)容如下

1.功能需求

根據(jù)索引選擇跟不同的人進(jìn)行聊天

Vue實(shí)現(xiàn)聊天界面

Vue實(shí)現(xiàn)聊天界面

2.代碼展示

mock.js:

import Mock from ’mockjs’Mock.mock('/chatchild',{ ’result’:[{ id:'001', imgurl:'/static/image/10.jpg', name:'XKDK', date:'09:23', words:'哈哈,好噠'},// ... ... ]});export default Mock

userinfo.js:

let usermsg={ id:'122', imgurl:'/static/image/8.jpg', words:'是的!', data:{id:'1529',imgurl:'/static/image/7.jpg',name:'易安居士',words:[ {info:'在嗎?'}, {info:'不在'}, {info:'你把草稿交了沒有'}, {info:'我今天中午吃完飯 就一直看劇了'}, {info:'我發(fā)現(xiàn)我真的是宅女'}, {info:'哈哈哈'}, {info:'有空找你約頓飯'}, {info:'嗯嗯'}, {info:'反正影響不大'}] }}export default usermsg

index.js:

import Vue from ’vue’import Router from ’vue-router’import Chat from ’../components/Chat.vue’import ChatDetail from ’../components/Pages/ChatDetail.vue’Vue.use(Router)export default new Router({ routes: [ { path: ’/Chat ’, component: Chat }, { path:’/ChatDetail’, component:ChatDetail } ]})// 解決路由報(bào)錯(cuò)的代碼const originalPush = Router.prototype.pushRouter.prototype.push = function push(location) { return originalPush.call(this, location).catch(err => err)}

Chat.vue:

<template> <div id='chat'> <Bottom /> <Header :name='msg' /> <div class='chat_alluser'> <div ref='chatuser' @click='checkChild(index)' v-for='(item,index) in chat' :key='index'><ChatChild :imgsrc='item.imgurl' :nickname='item.name' :time='item.date' :word='item.words' /> </div> </div> </div></template><script>import Bottom from '../components/Menu/Bottom';import Header from '../components/Menu/Header';import ChatChild from '../components/Pages/ChatChild';export default { name: 'Chat', components: { Bottom: Bottom, Header: Header, ChatChild: ChatChild }, data() { return { msg: '微信', chat: null, name: null }; }, mounted() { this.$axios.get('/chatchild').then(res => { this.chat = res.data.result; }); }, methods: { checkChild(index) { this.$refs.chatuser[index].style.backgroundColor = 'rgb(240,240,240)'; // 動(dòng)態(tài)dom元素渲染完成之后,跳轉(zhuǎn)到另一個(gè)界面(ChatDetail) // 獲取動(dòng)態(tài)name let username = this.chat[index].name; this.$nextTick(() => {this.$router.push({ path: '/ChatDetail', query: { name: username }}); }); } }};</script><style lang='scss' scope>#chat { width: 100%; .chat_alluser { margin-bottom: 7.5rem; .chatuser { position: relative; top: 3.5rem; padding: 0.3rem 0; } }}</style>

父組件使用子組件里的屬性和方法:在父組件中的子組件上定義ref屬性,通過 this.$ refs.name.屬性或this.$refs.name.方法

ChatChild.vue:

<template> <div id='chatchild'> <div class='photo'> <img :src='http://www.aoyou183.cn/bcjs/imgsrc' alt /> </div> <div class='content'> <div> <span class='content_nickname'>{{nickname}}</span> <span class='content_time'>{{time}}</span> </div> <span class='content_word'>{{word}}</span> </div> </div></template><script>export default { name: 'ChatChild', props:{ ’imgsrc’:String, ’nickname’:String, ’time’:String, ’word’:String }};</script><style lang='scss' scope>#chatchild { width: 100%; height: 5rem; display: flex; flex-direction: row; box-sizing: border-box; .photo { flex: 1; height: 5rem; img{object-fit: cover;width: 4rem;height: 4rem;border-radius: 5px;display: block;margin: 0 auto;margin-top: 0.5rem;margin-left: 1rem; } } .content { flex: 4; height: 5rem; border-bottom: 0.5px solid rgb(240, 240, 240); padding-left: 0.5rem; padding-top: 0.5rem; box-sizing: border-box; div{ .content_nickname{display: inline-block;font-size: 1.1rem;margin-top: 0.3rem; } .content_time{float: right;margin-right: 1rem;color: rgb(209, 206, 206);font-size: 0.8rem; } } .content_word{ color: rgb(209, 206, 206); font-size: 0.8rem; display: block; margin-top: 0.5rem; } }}</style>

ChatDetail.vue:

<template> <div id='chatdetail'> <div class='chattop'> <div @click='goback' class='chattop_back'><icon-svg icon- /> </div> <div class='chattop_name'>{{name}}</div> <div class='chattop_more'><icon-svg icon- /> </div> </div> <div class='chatcontent'> <ChatMsg ref='chatmsg' /> </div> <div class='chatfooter'> <div @click='changeSound'><icon-svg :icon- /> </div> <div><input ref='sendcontent' @keypress='sendmsg' :type='istype' :value='isvalue' /> </div> <div><icon-svg icon- /> </div> <div><icon-svg icon- /> </div> </div> </div></template><script>import ChatMsg from './ChatMsg';export default { name: 'ChatDetail', data() { return { name: null, issound: 'xiaoxitongzhi', istype: 'text', isvalue: '', isshow: false, tomsg: '', msgchild: null }; }, components: { ChatMsg: ChatMsg }, mounted() { this.name = this.$route.query.name; this.msgchild = this.$refs.chatmsg; }, methods: { // 進(jìn)行返回操作 goback() { this.$router.go(-1); }, // 切換input的類型 changeSound() { // 在data中定義一個(gè)變量isshow:false,利用this.isshow與!this.isshow進(jìn)行切換 if (!this.isshow) {this.isshow = true;this.issound = 'yuyin';this.istype = 'button';this.isvalue = '按住 說話'; } else {this.isshow = false;this.issound = 'xiaoxitongzhi';this.istype = 'text';this.isvalue = ''; } }, // 發(fā)送消息 sendmsg(e) { // 1、用ref定義輸入回復(fù)內(nèi)容的input文本框,定義sendcontent變量接收其value值(輸入的內(nèi)容) let sendcontent = this.$refs.sendcontent.value; if (e.keyCode === 13 && sendcontent.split(' ').join('').length !== 0) {// 2、將ChatDetail(父)組件中的sendcontent(文本框輸入的值)先用tomsg接收this.tomsg = sendcontent;// 3、用ref定義ChatMsg(子)組件,并在mounted中使用$refs獲取,即this.msgchild// 4、調(diào)子組件里的方法,并將tomsg傳到ChatMsg(子)組件(具體的聊天內(nèi)容)中this.msgchild.saveMsg(this.tomsg);// 5、發(fā)送完一條信息之后,需清空文本框this.$refs.sendcontent.value = '';// 回車時(shí),調(diào)用子組件的隨機(jī)消息的方法this.msgchild.randomMsg(); } } }};</script><style lang='scss' scope>#chatdetail { position: relative; background-color: rgb(238, 212, 238); .chattop { position: fixed; top: 0; left: 0; z-index: 10; width: 100%; height: 3.5rem; line-height: 3.5rem; background-color: rgb(240, 240, 240) !important; display: flex; flex-direction: row; .chattop_back { flex: 1; margin-left: 1rem; } .chattop_name { flex: 20; text-align: center; } .chattop_more { flex: 1; margin-right: 1rem; } } .chatcontent { width: 100%; height: 100%; } .chatfooter { position: fixed; left: 0; bottom: 0; z-index: 10; width: 100%; height: 3.5rem; line-height: 3.5rem; text-align: center; background-color: rgb(240, 240, 240) !important; display: flex; flex-direction: row; div:nth-child(1), div:nth-child(3), div:nth-child(4) { flex: 1; svg {font-size: 1.5rem;margin-top: 0.9rem; } } div:nth-child(2) { flex: 5; input {width: 100%;height: 2.5rem;outline: none;padding-left: 0.5rem;box-sizing: border-box;height: 2.5rem;margin-top: 0.5rem;border-style: none;font-size: 0.9rem;border-radius: 4px;background-color: #fff;color: #000; } } }}</style>

ChatMsg.vue:

<template> <div ref='msg'> <!-- 動(dòng)態(tài)創(chuàng)建 --> <div v-for='(item,index) in lists' :key='index'> <div v-if='item.id==122' class='user'><div v-scroll> <img :src='http://www.aoyou183.cn/bcjs/item.face' alt /> <div class='bubble'> <span>{{item.word}}</span> </div></div> </div> <div v-if='item.id==1529' class='touser'><div v-scroll> <img :src='http://www.aoyou183.cn/bcjs/item.face' alt /> <div class='tobubble'> <span>{{item.word}}</span> </div></div> </div> </div> </div></template><script>import userinfo from './userinfo';export default { name: 'ChatMsg', data() { return { userimg: '', lists: [] }; }, mounted() { this.userid = userinfo.id; this.userimg = userinfo.imgurl; }, // vue自動(dòng)滾動(dòng)到底部 directives: { scroll: { inserted(el) {el.scrollIntoView(); } } }, methods: { saveMsg(tomsg) { this.lists.push({id: this.userid,face: this.userimg,word: tomsg }); }, randomMsg() { let touserdata = userinfo.data; this.lists.push({id: touserdata.id,face: touserdata.imgurl,word: touserdata.words[Math.floor(Math.random() * touserdata.words.length)] .info }); } }};</script><style lang='scss' scope>#chatmsg { position: relative; top: 3.5rem; width: 100%; min-height: 44rem; background-color: rgb(238, 212, 238); margin-bottom: 3.5rem; overflow-x: hidden; overflow-y: auto; .user { position: relative; width: 100%; overflow: hidden; margin: 0.8rem 0; img { object-fit: cover; width: 3rem; height: 3rem; border-radius: 3px; float: right; margin-right: 1rem; } .bubble { position: relative; float: right; margin-right: 1rem; padding: 0.8rem; box-sizing: border-box; border-radius: 3px; max-width: 65%; background-color: rgb(116, 228, 116); span {height: 1.25rem;line-height: 1.25rem; } } .bubble::after { position: absolute; right: -1.3rem; top: 0.8rem; content: ''; width: 0; height: 0; border: 0.7rem solid; border-color: transparent transparent transparent rgb(116, 228, 116); } } .touser { position: relative; width: 100%; overflow: hidden; margin: 0.8rem 0; img { object-fit: cover; width: 3rem; height: 3rem; border-radius: 3px; float: left; margin-left: 1rem; } .tobubble { position: relative; float: left; margin-left: 1rem; padding: 0 0.7rem; box-sizing: border-box; border-radius: 3px; max-width: 65%; background-color: rgb(116, 228, 116); line-height: 3rem; } .tobubble::after { position: absolute; left: -1.3rem; top: 0.8rem; content: ''; width: 0; height: 0; border: 0.7rem solid; border-color: transparent rgb(116, 228, 116) transparent transparent; } }}</style>

3.目錄結(jié)構(gòu)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 嫩草网站永久入口 | 国产成人高清亚洲一区久久 | 91精品全国免费观看老司机 | 国产成人精品999在线观看 | 亚洲欧美中文字幕专区 | 亚洲国产成a人v在线观看 | 午夜一级福利 | 在线97| 久久久久久一级毛片免费野外 | 国产制服丝袜在线 | 日本护士xxxx爽爽爽 | 99pao在线视频成精品 | 黄色网页观看 | 91麻豆精品国产自产在线 | 久久一区二区三区免费播放 | 日本黄色小视频在线观看 | 亚洲成人自拍 | 亚洲福利国产 | 日本免费va毛片在线 | 成人精品国产亚洲 | 欧美日韩在线成人 | 一级黄色录像播放 | 日本h片a毛片在线播放 | 免费观看日本人成影片 | 久久在线观看免费视频 | 黄网站免费视频 | 四虎现在的网址入口2022 | 任你敢不一样精品的视频 | 在线观看日本免费视频大片 | 日韩免费毛片视频 | 国产大片黄在线看免费 | 欧美成人中文字幕 | 亚洲免费视频网址 | 欧美一级毛片欧美一级无片 | 99xxoo视频在线永久免费观看 | 国产亚洲精品一区二区在线观看 | 91极品尤物| 免费一级a毛片在线搐放正片 | 性做久久久久久网站 | 久久精品免视着国产成人 | 日韩一区国产二区欧美三 |