Vue如何獲取元素高度總是不準(zhǔn)確的問題
vue獲取元素高度總是不準(zhǔn)確
今天老大沒安排活干,也不想劃水,于是打算用一個(gè)websocket寫一個(gè)簡(jiǎn)易的聊天系統(tǒng)。
后端代碼很容易就寫好,但是前端是真的難搞,遇到一個(gè)很嚴(yán)重的問題:
當(dāng)發(fā)送一條消息或者是收到一條消息,消息展示界面不能滑到最下面,展示最新消息,于是,經(jīng)過一段時(shí)間的修改,發(fā)送新消息時(shí),滾動(dòng)條雖然能下滑,但是滑不到最底部,于是我添加了一個(gè)按鈕,使用按鈕,將滾動(dòng)條滑到最底部是可行的。
又使用debug調(diào)試,發(fā)現(xiàn):vue會(huì)先執(zhí)行你的其它方法,再渲染頁面,導(dǎo)致總是只能滑到上一條消息展示的高度。
于是我再百度,發(fā)現(xiàn):重置數(shù)據(jù)后,獲取dom元素高時(shí),dom元素還未渲染完畢,(可能這就是為什么只能滑到上一條消息展示的地方)
解決辦法
this.$nextTick()
函數(shù) :在下次DOM更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)
this.$nextTick(()=>{ this.goBottom(); // 滾動(dòng)條滑到底部的方法 })
補(bǔ)充:
使用vue獲取一個(gè)指定的元素的高度,可以使用vue的ref
當(dāng)ref加在普通的元素上,使用this.ref.name獲取到的是dom元素
下面是聊天的html代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>微聊</title> <script src="../static/js/vue.js"></script> <style> .cheet-box{ width: 592px; height: 160px; } .box{ /*margin: 0 auto;*/ /*overflow:auto;*/ overflow-y: auto; overflow-x: hidden; font-family: "微軟雅黑 Light"; width: 600px; height: 300px; background-color: #ecece9; border: none; box-shadow: aliceblue; margin-bottom: 20px; padding: 50px; } .to,.me{ word-wrap:break-word; display: block; width: 50%; padding: 26px; border-radius: 10px; background-color: #fff; margin: 5px 0 10px 0; } .system-log{ padding: 5px 0; color: darkgrey; text-align: center; } .to{ float: left; } .me{ float: right; } </style> </head> <body onbeforeunload="checkLeave()"> <div id="app"> <div class="box" id="box" ref="getHeight"> <div v-for="item in messageArray"> <!-- <div class="system-log">連接成功...</div>--> <div class="to" v-if="item.username != message.username" v-text="item.text"> </div> <div class="me" v-else v-text="item.text"> aaaaaa </div> </div> </div> <div> <input type="text" v-model="message.username"> </div> <div> <textarea type="text" v-model="message.text" class="cheet-box"></textarea> <input @click="sendMessage()" type="button" value="發(fā)送"/> <input @click="goBottom()" type="button" value="底部"/> </div> </div> <script> function checkLeave(){ sessionStorage.setItem('key','hello'); localStorage.setItem('2','3') } var websocket ; var vm = new Vue({ el:'#app', created(){ this.initWebSocket(); }, data:{ message:{ username:'', text:'', }, messageArray:[ ], }, methods:{ initWebSocket(){ if (typeof (WebSocket)=="undefined"){ alert('瀏覽器不支持WebSocket') }else { console.log('瀏覽器支持websocket') websocket = new WebSocket("ws://localhost:8080/ws/asset"); //連接打開事件 websocket.onopen = function() { console.log("Socket 已打開"); var obj = { text:'', username: '', log:'連接成功!' } websocket.send(JSON.stringify(obj)); }; //收到消息事件 websocket.onmessage = function(msg) { vm.pushArray(msg.data) }; //連接關(guān)閉事件 websocket.onclose = function() { console.log("Socket已關(guān)閉"); }; //發(fā)生了錯(cuò)誤事件 websocket.onerror = function() { alert("Socket發(fā)生了錯(cuò)誤"); } //窗口關(guān)閉時(shí),關(guān)閉連接 window.unload=function() { websocket.close(); }; } }, sendMessage(){ websocket.send(JSON.stringify(this.message)); this.message.text = '' }, pushArray(msg){ let message = JSON.parse(msg); console.log(message) if (message.username!='' && message.text!=''){ this.messageArray.push(message) this.$nextTick(()=>{ this.goBottom(); }) } }, goBottom(){ let box = document.getElementById('box'); box.getBoundingClientRect().height box.scrollTo(0,box.scrollHeight-box.clientHeight) } } }) </script> </body> </html>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Vue.js和Flask來構(gòu)建一個(gè)單頁的App的示例
本篇文章主要介紹了使用Vue.js和Flask來構(gòu)建一個(gè)單頁的App的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03vue實(shí)現(xiàn)接口封裝的實(shí)現(xiàn)示例
本文主要介紹了vue實(shí)現(xiàn)接口封裝的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11使用vue3搭建后臺(tái)系統(tǒng)的詳細(xì)步驟
這篇文章主要介紹了使用vue3搭建后臺(tái)系統(tǒng)的過程記錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08vue 運(yùn)用mock數(shù)據(jù)的示例代碼
本篇文章主要介紹了vue 運(yùn)用mock數(shù)據(jù)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Vue.js獲取手機(jī)系統(tǒng)型號(hào)、版本、瀏覽器類型的示例代碼
這篇文章主要介紹了vue js獲取手機(jī)系統(tǒng)型號(hào)、版本、瀏覽器類型的示例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Vue.js與 ASP.NET Core 服務(wù)端渲染功能整合
本文通過案例給大家詳細(xì)分析了ASP.NET Core 與 Vue.js 服務(wù)端渲染,需要的朋友可以參考下2017-11-11