vue 解決mintui彈窗彈起來,底部頁面滾動bug問題
經過dom層層注釋縮小反饋終于找到問題所在。
問題經過
我在彈起彈窗的時候,設置了popupVisible為true
然后觸發了vue的updated生命周期鉤子函數
然后我在這個函數里面做了去this.$refs.container.offsetHeight導致頁面重繪
然后就導致了底部頁面向上滾動
解決辦法
去掉updated函數里面的重繪方法
補充知識:項目總結之關于vue中使用mint-ui的mt-popup出現滾動穿透問題的解決總結
說實話,使用Mint-ui這個ui組件的過程中遇到了很多問題,這個ui組件問題真多。
先說今天的主題吧,我在使用popup選擇框的時候和datepicker時間選擇器的時候出現了滾動穿透的問題,特別是在ios上面。
找了好多方法,最后同事給出了一個好的方法,很簡潔,于是就想著總結下來。
防止滾動穿透 只需加入@touchmove.native.stop.prevent 阻止默認根元素的默認事件就可以了,native是關鍵,這個表示根元素的意思,也就是body或者html
代碼如下:
Popup組件:
<mt-popup v-model='popupVisible' position='bottom'> ... </mt-popup> // 防止滾動穿透 只需加入@touchmove.native.stop.prevent 阻止默認根元素的默認事件就可以了native是關鍵,這個表示根元素的意思,也就是body或者html <mt-popup v-model='popupVisible' position='bottom' @touchmove.native.stop.prevent> ... </mt-popup>
注意當mt-popup中還有div等子元素的時候,一定要注意,這個時候可能會有一些問題,會出現mt-popup這個元素也滾動不了的情況,所以說如果mt-popup本身不需要滾動的話,加了@touchmove.native.stop.prevent,底部頁面就不會跟著滑動,如果mt-popup里面有滾動條需要滾動的話,可能就滾動不了,這個時候需要采取常規方法了,如下:
// 解決方式,通過監聽popupVisible變量,在彈窗出現后禁止body節點touchMove事件,彈窗消失后恢復body節點的touchMove事件
//html 如下 <mt-popup v-model='popupVisible' position='bottom'> ... </mt-popup> // js 如下 const handler = function(e) { e.preventDefault(); } // vue實例內 watch: { popupVisible: function (val) { if(val) { document.getElementsByTagName(’body’)[0].addEventListener(’touchmove’, this.handler, { passive: false }); } else { document.getElementsByTagName(’body’)[0].removeEventListener(’touchmove’, this.handler, { passive: false }); } } }
Datetime Picker:
<mt-datetime-picker ref='picker' type='time' v-model='pickerValue' @touchmove.native.stop.prevent> </mt-datetime-picker>
對于時間組件加了@touchmove.native.stop.prevent,選擇時間滾動的時候底部頁面就不會跟著滾動了,很完美。
@touchmove.native.stop.prevent可以使我們省好多事,用起來吧!
以上這篇vue 解決mintui彈窗彈起來,底部頁面滾動bug問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。