Vue如何獲取元素高度總是不準(zhǔn)確的問(wèn)題
vue獲取元素高度總是不準(zhǔn)確
今天老大沒(méi)安排活干,也不想劃水,于是打算用一個(gè)websocket寫(xiě)一個(gè)簡(jiǎn)易的聊天系統(tǒng)。
后端代碼很容易就寫(xiě)好,但是前端是真的難搞,遇到一個(gè)很?chē)?yán)重的問(wèn)題:
當(dāng)發(fā)送一條消息或者是收到一條消息,消息展示界面不能滑到最下面,展示最新消息,于是,經(jīng)過(guò)一段時(shí)間的修改,發(fā)送新消息時(shí),滾動(dòng)條雖然能下滑,但是滑不到最底部,于是我添加了一個(gè)按鈕,使用按鈕,將滾動(dòng)條滑到最底部是可行的。
又使用debug調(diào)試,發(fā)現(xiàn):vue會(huì)先執(zhí)行你的其它方法,再渲染頁(yè)面,導(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");
//連接打開(kāi)事件
websocket.onopen = function() {
console.log("Socket 已打開(kāi)");
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)文章
vuex存儲(chǔ)數(shù)據(jù)的幾種方法實(shí)例詳解
在瀏覽網(wǎng)頁(yè)時(shí)我們有些時(shí)候需要記住一些用戶(hù)選擇的信息,比如登陸時(shí)我們?nèi)绻x擇了記住密碼,那么我們下次進(jìn)入該網(wǎng)頁(yè)時(shí)就會(huì)有你上次的登陸信息,下面這篇文章主要給大家介紹了關(guān)于vuex存儲(chǔ)數(shù)據(jù)的幾種方法,需要的朋友可以參考下2022-10-10
Vue $emit $refs子父組件間方法的調(diào)用實(shí)例
今天小編就為大家分享一篇Vue $emit $refs子父組件間方法的調(diào)用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue新vue-cli3環(huán)境配置和模擬json數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇vue新vue-cli3環(huán)境配置和模擬json數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue路由跳轉(zhuǎn)時(shí)判斷用戶(hù)是否登錄功能的實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇vue路由跳轉(zhuǎn)時(shí)判斷用戶(hù)是否登錄功能的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Vue項(xiàng)目中使用fontawesome圖標(biāo)庫(kù)的方法
fontawesome的圖標(biāo)有免費(fèi)版和專(zhuān)業(yè)版,本文主要使用free版本,一般free版本的圖標(biāo)夠用,free圖標(biāo)又劃分為三個(gè)圖標(biāo)庫(kù),主要有實(shí)心圖標(biāo)solid、常規(guī)圖標(biāo)regular及品牌圖標(biāo)brand,根據(jù)需求去下載對(duì)應(yīng)的圖標(biāo)庫(kù),無(wú)須全部下載,對(duì)vue?fontawesome圖標(biāo)庫(kù)相關(guān)知識(shí)感興趣的朋友一起看看吧2023-12-12
vue?element表格某一列內(nèi)容過(guò)多,超出省略號(hào)顯示的實(shí)現(xiàn)
這篇文章主要介紹了vue?element表格某一列內(nèi)容過(guò)多,超出省略號(hào)顯示的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

