在使用vue.js框架的時候,有時候會希望在頁面渲染完成之后,再執行函數方法來處理初始化相關的操作,如果只處理頁面位置、寬或者高時,必須要在頁面完全渲染之后才可以,頁面沒有加載完成之前,獲取到的寬高不准確。使用過jquery的都知道,有個ready方法可以使用,但vue.js則需要結合watch和nextTick方法來使用。
1.下面開始介紹下,在頁面加載一個數據列表完成之后,頁面自動滾動定位到中間某個列表元素,需要在列表數據渲染完成,計算列表高度,再控制定位到指定行。首先介紹下一開始嘗試沒有生效的方案,這也是大家最容易出現錯誤的地方,vue.js提供的mounted函數,表示掛載到實例上去之后調用該鈎子。

2.運行之后,發現mounted執行的時候,獲取到的height值不對,打個斷點也可以發現,此時頁面沒有渲染完成,列表塊還是一片空白

3.此時查詢官方api文檔發現,有一個nextTick方法,意思是在下次 DOM 更新循環結束之后執行延遲回調。在修改數據之后立即使用這個方法,獲取更新后的 DOM。使用之后發現,還是不能解決我所需要的效果

4.繼續查詢api文檔發現,watch方法,用於觀察Vue實例上的數據變動。對應一個對象,鍵是觀察表達式,值是對應回調,再次嘗試,運行后發現還是不行

5.最終把watch和nextTick組合一起,watch:{ showList:function(){ this.goPrice(0); }}
showList對應表格頁面的綁定變量 <tr v-for="(item,index) in showList">

6.運行后發現,已經達到了預期的效果
注意:這里 watch 要和 methods 方法平級展示
watch:{ htcfOrder:function(){ //頁面渲染完成后的操作 this.$nextTick(function(){ // 開工前 if(vm.htcfOrder !=null && vm.htcfOrder.beforeWorkList !=null && vm.htcfOrder.beforeWorkList.length>0){ for (let i = 0; i < vm.htcfOrder.beforeWorkList.length; i++) { if (vm.htcfOrder.beforeWorkList[i].urlType == 1){ var player2 = videojs(vm.htcfOrder.beforeWorkList[i].extKey+i,{ muted: false,controls : true,height:300,width:300,poster:'',src:'',preload:"auto" },function(){ }); player2.reset(); player2.src(vm.htcfOrder.beforeWorkList[i].extValue); player2.load(); } } } }) } },
methods:{}
