最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue如何獲取元素高度總是不準確的問題

 更新時間:2023年10月21日 10:50:29   作者:神仙劉  
這篇文章主要介紹了Vue如何獲取元素高度總是不準確的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

vue獲取元素高度總是不準確

今天老大沒安排活干,也不想劃水,于是打算用一個websocket寫一個簡易的聊天系統(tǒng)。

后端代碼很容易就寫好,但是前端是真的難搞,遇到一個很嚴重的問題:

當發(fā)送一條消息或者是收到一條消息,消息展示界面不能滑到最下面,展示最新消息,于是,經(jīng)過一段時間的修改,發(fā)送新消息時,滾動條雖然能下滑,但是滑不到最底部,于是我添加了一個按鈕,使用按鈕,將滾動條滑到最底部是可行的。

又使用debug調(diào)試,發(fā)現(xiàn):vue會先執(zhí)行你的其它方法,再渲染頁面,導致總是只能滑到上一條消息展示的高度。

于是我再百度,發(fā)現(xiàn):重置數(shù)據(jù)后,獲取dom元素高時,dom元素還未渲染完畢,(可能這就是為什么只能滑到上一條消息展示的地方)

解決辦法

this.$nextTick()函數(shù) :在下次DOM更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)

this.$nextTick(()=>{ 
     this.goBottom(); // 滾動條滑到底部的方法
   })

補充:

使用vue獲取一個指定的元素的高度,可以使用vue的ref

當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ā)生了錯誤事件
                       websocket.onerror = function() {
                           alert("Socket發(fā)生了錯誤");
                       }

                       //窗口關(guān)閉時,關(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é)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue無限輪播插件代碼實例

    vue無限輪播插件代碼實例

    這篇文章主要介紹了vue無限輪播插件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • el-tree文字顯示不全的解決辦法

    el-tree文字顯示不全的解決辦法

    本文主要介紹了el-tree文字顯示不全的解決辦法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • vuex存儲數(shù)據(jù)的幾種方法實例詳解

    vuex存儲數(shù)據(jù)的幾種方法實例詳解

    在瀏覽網(wǎng)頁時我們有些時候需要記住一些用戶選擇的信息,比如登陸時我們?nèi)绻x擇了記住密碼,那么我們下次進入該網(wǎng)頁時就會有你上次的登陸信息,下面這篇文章主要給大家介紹了關(guān)于vuex存儲數(shù)據(jù)的幾種方法,需要的朋友可以參考下
    2022-10-10
  • Vue $emit $refs子父組件間方法的調(diào)用實例

    Vue $emit $refs子父組件間方法的調(diào)用實例

    今天小編就為大家分享一篇Vue $emit $refs子父組件間方法的調(diào)用實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue新vue-cli3環(huán)境配置和模擬json數(shù)據(jù)的實例

    vue新vue-cli3環(huán)境配置和模擬json數(shù)據(jù)的實例

    今天小編就為大家分享一篇vue新vue-cli3環(huán)境配置和模擬json數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue路由跳轉(zhuǎn)時判斷用戶是否登錄功能的實現(xiàn)

    vue路由跳轉(zhuǎn)時判斷用戶是否登錄功能的實現(xiàn)

    下面小編就為大家?guī)硪黄獀ue路由跳轉(zhuǎn)時判斷用戶是否登錄功能的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • vue自定義組件如何添加使用原生事件

    vue自定義組件如何添加使用原生事件

    這篇文章主要介紹了vue自定義組件如何添加使用原生事件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue實例從初始化到掛載的完整流程

    Vue實例從初始化到掛載的完整流程

    本文詳細解析了Vue實例從初始化到掛載的完整流程,首先通過new Vue()觸發(fā)_init方法進行初始化,依次完成配置合并、生命周期/事件/渲染初始化,需要的朋友可以參考下
    2025-12-12
  • Vue項目中使用fontawesome圖標庫的方法

    Vue項目中使用fontawesome圖標庫的方法

    fontawesome的圖標有免費版和專業(yè)版,本文主要使用free版本,一般free版本的圖標夠用,free圖標又劃分為三個圖標庫,主要有實心圖標solid、常規(guī)圖標regular及品牌圖標brand,根據(jù)需求去下載對應的圖標庫,無須全部下載,對vue?fontawesome圖標庫相關(guān)知識感興趣的朋友一起看看吧
    2023-12-12
  • vue?element表格某一列內(nèi)容過多,超出省略號顯示的實現(xiàn)

    vue?element表格某一列內(nèi)容過多,超出省略號顯示的實現(xiàn)

    這篇文章主要介紹了vue?element表格某一列內(nèi)容過多,超出省略號顯示的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

马龙县| 漯河市| 梁河县| 汾阳市| 方正县| 海城市| 黄陵县| 南澳县| 塔城市| 龙岩市| 山东| 建德市| 南郑县| 固镇县| 乌恰县| 淳安县| 海阳市| 黑河市| 金阳县| 温泉县| 大连市| 大宁县| 新巴尔虎左旗| 荥阳市| 大悟县| 湛江市| 五指山市| 乌苏市| 岑巩县| 太仆寺旗| 蓬莱市| 象山县| 山阴县| 柞水县| 孟村| 新疆| 龙泉市| 新化县| 乐安县| 松滋市| 泗洪县|