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

解決Mint-ui 框架Popup和Datetime Picker組件滾動(dòng)穿透的問(wèn)題

 更新時(shí)間:2020年11月04日 11:35:04   作者:Inc桂  
這篇文章主要介紹了解決Mint-ui 框架Popup和Datetime Picker組件滾動(dòng)穿透的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

在移動(dòng)端開(kāi)發(fā)中使用到了Mint-ui組件庫(kù),其中有兩個(gè)組件Popup組件和Datetime Picker存在滾動(dòng)性穿透問(wèn)題,官方文檔最新版并沒(méi)有解決這個(gè)問(wèn)題。

現(xiàn)象還原

官方地址

手機(jī)掃碼查看demo,查看兩個(gè)組件Popup組件和Datetime的例子演示。

問(wèn)題原因

HTML5觸摸事件touchmove事件:當(dāng)手指在屏幕上滑動(dòng)的時(shí)候連續(xù)地觸發(fā)

所以當(dāng)激活出組件Popup組件和Datetime Picker的彈出層時(shí),我們?cè)趶棇舆x擇內(nèi)容時(shí)上下連續(xù)滑動(dòng)是會(huì)觸發(fā)該事件

解決思路

在彈出層出現(xiàn)之后阻止body的touchmove事件,在彈層消失之后移除阻止事件

使用mint-ui組件庫(kù)的解決方式

Popup組件

// 官方實(shí)例

<mt-popup
 v-model="popupVisible"
 position="bottom">
 ...
</mt-popup>

// 解決方式,通過(guò)監(jiān)聽(tīng)popupVisible變量,在彈窗出現(xiàn)后禁止bode節(jié)點(diǎn)touchMove事件,彈窗消失后恢復(fù)body節(jié)點(diǎn)的touchMove事件

const handler = function(e) {
  e.preventDefault();
}

// vue實(shí)例內(nèi)
watch: {
  popupVisible: function (val) {
   if(val) {
     document.getElementsByTagName('body')[0].addEventListener('touchmove', this.handler, { passive: false });
   } else {
     document.getElementsByTagName('body')[0].addEventListener('touchmove', this.handler, { passive: false });
   }
  }
}

Datetime Picker

// 官方實(shí)例

<mt-datetime-picker
  ref="picker"
  type="time"
  v-model="pickerValue">
</mt-datetime-picker>

// 解決方式:這個(gè)組件比較坑,由于Datetime Picker沒(méi)有提供彈窗顯示和隱藏的綁定變量,所以我們無(wú)采用解決popup的方式解決問(wèn)題,只能通過(guò)打開(kāi)事件,確認(rèn)事件、取消事件,點(diǎn)擊蒙層彈窗消失這幾個(gè)時(shí)間點(diǎn)去解決。官方給出的屬性方法只支持確認(rèn)事件,打開(kāi)事件。沒(méi)有明文給出取消事件的回調(diào)函數(shù),更不支持點(diǎn)擊蒙層彈窗消失事件,所以很坑。

<mt-datetime-picker
  ref="picker"
  type="time"
  v-model="pickerValue"
  @confirm="confirm">
</mt-datetime-picker>

const handler = function(e) {
  e.preventDefault();
}

// vue實(shí)例內(nèi)

methods: {
  openPicker() { // 打開(kāi)事件
    document.getElementsByTagName('body')[0].addEventListener('touchmove', this.handler, { passive: false });
    this.$refs.picker.open();
  },
  confirm() { // 確認(rèn)事件
    document.getElementsByTagName('body')[0].addEventListener('touchmove', this.handler, { passive: false });
  }
}

此時(shí)還缺一個(gè)取消回調(diào)還有蒙層點(diǎn)擊事件,然后看源碼其實(shí)mint-ui源碼里是支持取消回調(diào)事件的,另外面,驚喜的是在2.0版本之后的mint-ui給Datetime picker組件 新加了visible-change事件和closeOnClickModal屬性(傳送門(mén)),但官方文檔依舊沒(méi)更新出來(lái)這些屬性。現(xiàn)在就很好的解決了上述問(wèn)題。

而且有了visible-change事件就可以不用按上述思路解決了。組件部分源碼如下:

props: {
  ...,
  closeOnClickModal: {
    type: Boolean,
    default: true
  }
},
watch: {
  ...,
 visible(val) {
  this.$emit('visible-change', val);
 }
},
...
<span class="mint-datetime-action mint-datetime-cancel" @click="visible = false;$emit('cancel')">{{ cancelText }}</span>

直接一個(gè)visible-change方法搞定

<mt-datetime-picker
  ref="picker"
  type="time"
  v-model="pickerValue"
  @confirm="confirm"
  @visible-change=""handleValueChange>
</mt-datetime-picker>

const handler = function(e) {
  e.preventDefault();
}

// vue實(shí)例內(nèi)
methods: {
  handleValueChange: function (val) {
   if(val) {
     document.getElementsByTagName('body')[0].addEventListener('touchmove', this.handler, { passive: false });
   } else {
     document.getElementsByTagName('body')[0].addEventListener('touchmove', this.handler, { passive: false });
   }
  }
}

上面的方法已經(jīng)可以解決項(xiàng)目遇到到的坑了,但是每個(gè)頁(yè)面用到組件Popup組件和Datetime Picker都需要去加上這段代碼,當(dāng)頁(yè)面存在多個(gè)Popup組件就需要監(jiān)聽(tīng)多個(gè)變量。

更好的解決方式(上述方式在網(wǎng)上也有類(lèi)似解決方式,自己補(bǔ)充了visible-change方案)

在項(xiàng)目中按上面那樣解決太麻煩了,所以又想了一個(gè)體驗(yàn)比較好的解決方案,因?yàn)閺棇拥某霈F(xiàn)和消失會(huì)觸發(fā)組件更新,所以想到和可以全局注冊(cè)一個(gè)指令v-roll,運(yùn)用指令的componentUpdated鉤子來(lái)實(shí)現(xiàn)這個(gè)功能。代碼如下

// 全局注冊(cè)指令
const handler = (e) => {
 e.preventDefault();
};
Vue.directive('roll', {
 componentUpdated(el, binding) {
  if (binding.value) {
   document.getElementsByTagName('body')[0].addEventListener('touchmove', handler, { passive: false });
  } else {
   document.getElementsByTagName('body')[0].removeEventListener('touchmove', handler, { passive: false });
  }
 }
});

這樣一來(lái)精簡(jiǎn)了很多代碼,其他開(kāi)發(fā)者用到時(shí)只需要給對(duì)應(yīng)組件加一個(gè)v-roll指令即可。

// popup組件處理方式
<mt-popup
 v-model="popupVisible"
 v-roll:visible=popupVisible>
 ...
</mt-popup>

// mt-datetime-picker組件處理方式
<mt-datetime-picker 
 ref="datePicker" 
 v-model="date"
 @visible-change="handleVisibleChange"
 v-roll:visible=pVisible
 ...>
</mt-datetime-picker>
...
data: {
  pVisible: false 
},
methods: {
  handleVisibleChange (isVisible) {
    this.pVisible = isVisible;
  }
}

接著還遇到一個(gè)坑,當(dāng)同一個(gè)視圖頁(yè)面存在多個(gè)組件Popup組件和Datetime Picker使用指令時(shí),會(huì)集體觸發(fā)指令。所以會(huì)相互覆蓋,如打開(kāi)A彈層,阻止頁(yè)面touchMove事件,但另外一個(gè)popuu組件也觸發(fā)鉤子函數(shù),又取消阻止touchMove事件,導(dǎo)致沒(méi)效果。

componentUpdated:指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。// 這里目前自己的理解是由于彈層出現(xiàn)和消失導(dǎo)致所在視圖界面節(jié)點(diǎn)更新,所以其他節(jié)點(diǎn)綁定了v-roll指令的鉤子也被觸發(fā)了

解決方案:對(duì)于一個(gè)視圖內(nèi)使用多個(gè)多個(gè)組件Popup組件和Datetime Picker的,給指令傳入數(shù)組類(lèi)型

// 全局注冊(cè)指令
const handler = (e) => {
 e.preventDefault();
};
Vue.directive('roll', {
 componentUpdated(el, binding) {
  if (binding.value instanceof Array) {
   const visible = binding.value.some(e => e); // 當(dāng)視圖所有控制彈層的變量存在一個(gè)是true,即可阻止touchmove事件
   if (visible) {
    document.getElementsByTagName('body')[0].addEventListener('touchmove', handler, { passive: false });
   } else {
    document.getElementsByTagName('body')[0].removeEventListener('touchmove', handler, { passive: false });
   }
  } else if (typeof binding.value === 'boolean') {
   if (binding.value) {
    document.getElementsByTagName('body')[0].addEventListener('touchmove', handler, { passive: false });
   } else {
    document.getElementsByTagName('body')[0].removeEventListener('touchmove', handler, { passive: false });
   }
  }
 }
});

// popup組件處理方式
<mt-popup
 v-model="popupVisible"
 v-roll:visible=[popupVisible, pVisible]>
 ...
</mt-popup>

// mt-datetime-picker組件處理方式
<mt-datetime-picker 
 ref="datePicker" 
 v-model="date"
 @visible-change="handleVisibleChange"
 v-roll:visible=[popupVisible, pVisible]
 ...>
</mt-datetime-picker>
...
data: {
  pVisible: false 
},
methods: {
  handleVisibleChange (isVisible) {
    this.pVisible = isVisible;
  }
}

目前mint-ui還未修復(fù)該問(wèn)題,所以暫且使用上述方案解決。一開(kāi)始打算改源碼,但是不現(xiàn)實(shí),因?yàn)橐院罂赡苄枰耺int-ui版本。大家也可以幫忙看下以上解決方式是否有坑。

補(bǔ)充知識(shí):Vue中使用mint-ui的日期插件時(shí)在ios上會(huì)有滾動(dòng)穿透問(wèn)題

問(wèn)題:在ios上選擇日期上下滑動(dòng)時(shí),整個(gè)頁(yè)面會(huì)跟著滾動(dòng),安卓是正常的

解決方法就是在日期彈出層出現(xiàn)的時(shí)候禁止頁(yè)面的默認(rèn)滾動(dòng)機(jī)制,日期彈出層消失的時(shí)候解除禁止頁(yè)面的默認(rèn)滾動(dòng)機(jī)制

1.調(diào)用日期組件

 <div class="datePicker" style="z-index: 9999">
   <mt-datetime-picker
    type="date"
    ref="picker"
    v-model="nowTime"
    year-format="{value} 年"
    month-format="{value} 月"
    date-format="{value} 日"
    @confirm="handleConfirm"
    :startDate="startDate"
    :endDate="endDate"
   >
   </mt-datetime-picker>
  </div>

2.設(shè)置監(jiān)聽(tīng)函數(shù)

data () {
    return {
     birthday:"", //出生日期
     startDate: new Date('1952'),
     endDate:new Date(),
     nowTime:'1992-09-15',
    
     /*---------監(jiān)聽(tīng)函數(shù)--------------*/
     handler:function(e){e.preventDefault();}
    }
   },
   methods:{
    /*解決iphone頁(yè)面層級(jí)相互影響滑動(dòng)的問(wèn)題*/
    closeTouch:function(){
     document.getElementsByTagName("body")[0].addEventListener('touchmove',
      this.handler,{passive:false});//阻止默認(rèn)事件
     console.log("closeTouch haved happened.");
    },
    openTouch:function(){
     document.getElementsByTagName("body")[0].removeEventListener('touchmove',
      this.handler,{passive:false});//打開(kāi)默認(rèn)事件
     console.log("openTouch haved happened.");
    },
 }

然后監(jiān)聽(tīng),彈窗出現(xiàn)消失的時(shí)候調(diào)用相應(yīng)的方法

//偵聽(tīng)屬性
watch:{
  signReasonVisible:function(newvs,oldvs){//picker關(guān)閉沒(méi)有回調(diào)函數(shù),所以偵聽(tīng)該屬性替代
    if(newvs){
      this.closeTouch();
    }else{
      this.openTouch();
    }
  }
},

以下為datetime-picker的處理:(openPicker1為觸發(fā)打開(kāi)選擇器的事件, handleConfirm (data)是選中日期后的回調(diào)函數(shù))

 openPicker () {
      this.$refs.picker.open();
      this.closeTouch();//關(guān)閉默認(rèn)事件
 
     },
     handleConfirm (data) {
      let date = moment(data).format('YYYY-MM-DD')
      this.birthday = date;
      this.openTouch();//打開(kāi)默認(rèn)事件
 
     },

然后就解決了這個(gè)問(wèn)題!

以上這篇解決Mint-ui 框架Popup和Datetime Picker組件滾動(dòng)穿透的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 編寫(xiě)v-for循環(huán)的技巧匯總

    編寫(xiě)v-for循環(huán)的技巧匯總

    這篇文章主要介紹了編寫(xiě)更好的v-for循環(huán)的6種技巧,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • Vue 集成 PDF.js 實(shí)現(xiàn) PDF 預(yù)覽和添加水印的步驟

    Vue 集成 PDF.js 實(shí)現(xiàn) PDF 預(yù)覽和添加水印的步驟

    這篇文章主要介紹了如何在 Vue 中集成 Mozilla/PDF.js ,實(shí)現(xiàn)自定義的 PDF 預(yù)覽器,以及給被預(yù)覽的 PDF 添加水印
    2021-01-01
  • Vue實(shí)現(xiàn)多圖添加顯示和刪除

    Vue實(shí)現(xiàn)多圖添加顯示和刪除

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)多圖添加顯示和刪除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 怎樣在vue項(xiàng)目下添加ESLint的方法

    怎樣在vue項(xiàng)目下添加ESLint的方法

    這篇文章主要介紹了怎樣在vue項(xiàng)目下添加ESLint的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • element中使用formdata進(jìn)行上傳文件的方法

    element中使用formdata進(jìn)行上傳文件的方法

    本文主要介紹了elementUI中使用formdata進(jìn)行上傳文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Vue中組件(Component)和插件(Plugin)的區(qū)別及說(shuō)明

    Vue中組件(Component)和插件(Plugin)的區(qū)別及說(shuō)明

    這篇文章主要介紹了Vue中組件(Component)和插件(Plugin)的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Vue中如何使用ElementUI實(shí)現(xiàn)圖片上傳

    Vue中如何使用ElementUI實(shí)現(xiàn)圖片上傳

    這篇文章主要介紹了Vue中如何使用ElementUI實(shí)現(xiàn)圖片上傳,這里用了elementUI的一個(gè)簡(jiǎn)單的例子,給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • vue數(shù)據(jù)push后不能響應(yīng)式更新的問(wèn)題

    vue數(shù)據(jù)push后不能響應(yīng)式更新的問(wèn)題

    這篇文章主要介紹了vue數(shù)據(jù)push后不能響應(yīng)式更新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue使用canvas手寫(xiě)輸入識(shí)別中文

    vue使用canvas手寫(xiě)輸入識(shí)別中文

    這篇文章主要介紹了vue使用canvas手寫(xiě)輸入識(shí)別中文,工作時(shí)遇到一些項(xiàng)目如:系統(tǒng)上的輸入法使用不方便,客戶(hù)要求做一個(gè)嵌入web網(wǎng)頁(yè)的手寫(xiě)輸入法。下面我們來(lái)看看文章得具體描述吧
    2021-11-11
  • Vue3開(kāi)發(fā)必備的六個(gè)VSCode插件推薦

    Vue3開(kāi)發(fā)必備的六個(gè)VSCode插件推薦

    在VSCode中添加好用的插件可以提高我們的開(kāi)發(fā)效率,這些可以幫助我們格式化,擴(kuò)充性,執(zhí)行最佳實(shí)踐的代碼方式,自動(dòng)完成一些瑣碎的事情,下面這篇文章主要給大家推薦介紹了關(guān)于Vue3開(kāi)發(fā)必備的六個(gè)VSCode插件,需要的朋友可以參考下
    2022-12-12

最新評(píng)論

金川县| 永修县| 金山区| 金阳县| 英吉沙县| 奈曼旗| 临泉县| 神木县| 洛浦县| 绵竹市| 五河县| 阳原县| 湛江市| 临澧县| 云阳县| 平泉县| 安多县| 洪洞县| 新丰县| 云浮市| 阿克苏市| 上蔡县| 广灵县| 界首市| 泸州市| 合阳县| 河池市| 盱眙县| 博客| 清流县| 平阴县| 湛江市| 资中县| 琼结县| 贵定县| 阳山县| 巴中市| 揭阳市| 岱山县| 密山市| 米泉市|