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

Element-ui中元素滾動(dòng)時(shí)el-option超出元素區(qū)域的問題

 更新時(shí)間:2019年05月30日 15:29:32   作者:shyg  
這篇文章主要介紹了Element-ui中元素滾動(dòng)時(shí)el-option超出元素區(qū)域的問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

復(fù)現(xiàn)場景, 看圖

分析原因

為簡單起見, 把選項(xiàng)區(qū)域描述為popperEl

  • popperEl的z-index 比較大, 會覆蓋在其他元素上面
  • popperEl默認(rèn)是插入body元素的(可以將popper-append-to-body設(shè)為false后不插入到body)
  • popperEl是在mouseup事件里去做隱藏邏輯的, 而按下鼠標(biāo), 移動(dòng)滾動(dòng)條的時(shí)候, 并沒有觸發(fā)mouseup事件.
  • popperEl并沒有監(jiān)聽滾動(dòng)事件(沒法監(jiān)聽, 也沒必要監(jiān)聽)

解決方案

 方案一

我最初想到的解決方案是通過css解決,通過popper-class屬性給Select下拉框添加類名,然后用css來做, 試了一下這個(gè)方案并不可行(只能在某些特定的場景下起作用),遂放棄,可能最優(yōu)雅最高性能的方法就是用css來搞定, 有踩過這個(gè)坑的朋友請指點(diǎn)一下

方案二

通過監(jiān)聽$root的scroll事件,利用事件冒泡,只需要在根元素上添加scroll事件的監(jiān)聽就可以了, 測試一番之后, 發(fā)現(xiàn)scroll事件根本不支持冒泡, event.bubbles為false)。

方案三

通過查看element-ui 的select.vue, 發(fā)現(xiàn)控制popperEl顯隱的是visible 和 emptyText這兩個(gè)實(shí)例屬性, 很明顯, emptytext是不能動(dòng)的, 只能在visible上動(dòng)手腳了. 這里放一小段源碼

<transition
 name="el-zoom-in-top"
 @before-enter="handleMenuEnter"
 @after-leave="doDestroy">
 <el-select-menu
  ref="popper"
  :append-to-body="popperAppendToBody"
  v-show="visible && emptyText !== false">
  <el-scrollbar
   tag="ul"
   wrap-class="el-select-dropdown__wrap"
   view-class="el-select-dropdown__list"
   ref="scrollbar"
   :class="{ 'is-empty': !allowCreate && query && filteredOptionsCount === 0 }"
   v-show="options.length > 0 && !loading">
   <el-option
    :value="query"
    created
    v-if="showNewOption">
   </el-option>
   <slot></slot>
  </el-scrollbar>
  <p
   class="el-select-dropdown__empty"
   v-if="emptyText &&
    (!allowCreate || loading || (allowCreate && options.length === 0 ))">
   {{ emptyText }}
  </p>
 </el-select-menu>
</transition>

全局搜索this.visible, 發(fā)現(xiàn)了這個(gè)方法

handleClose() {
  this.visible = false;
},

這下好辦了, 按圖索驥, 順藤摸瓜, 找到這個(gè)

<template>
 <div
  class="el-select"
  :class="[selectSize ? 'el-select--' + selectSize : '']"
  @click.stop="toggleMenu"
  v-clickoutside="handleClose">
  后面的省略...

找到v-clickoutside指令之后, 豁然開朗 原來點(diǎn)擊其他區(qū)域的時(shí)候, popperEl會自動(dòng)關(guān)閉的奧秘在這里, 結(jié)合方案二的靈感, 現(xiàn)給出如下代碼.

// src/mixins/fackClickOutSide.js
let lock = true;
let el = null;
const MousedownEvent = new Event('mousedown', {bubbles:true});
const MouseupEvent = new Event('mouseup', {bubbles:true});
const fakeClickOutSide = () => {
 document.dispatchEvent(MousedownEvent);
 document.dispatchEvent(MouseupEvent);
 lock = true; // console.log('dispatchEvent');
};
const mousedownHandle = e => {
 let classList = e.target.classList;
 if(classList.contains('el-select__caret') || classList.contains('el-input__inner')) {
  lock = false;
  return;
 }
 if(lock) return;
 fakeClickOutSide();
};
const mousewheelHandle = e => {
 if(lock || e.target.classList.contains('el-select-dropdown__item') || e.target.parentNode.classList.contains('el-select-dropdown__item')) return;
 fakeClickOutSide();
};
const eventListener = (type) => {
 el[type + 'EventListener']('mousedown', mousedownHandle);
 window[type + 'EventListener']('mousewheel', mousewheelHandle);
 window[type + 'EventListener']('DOMMouseScroll', mousewheelHandle); // fireFox 3.5+ 
}
export default {
 mounted() {
  el = this.$root.$el;
  el.addFakeClickOutSideEventCount = el.addFakeClickOutSideEventCount || 0;
  (! el.addFakeClickOutSideEventCount) && this.$nextTick(() => {
   eventListener('add');
  });
  el.addFakeClickOutSideEventCount += 1;
 },
 destroyed() {
  eventListener('remove');
  el.addFakeClickOutSideEventCount -= 1;
 },
}

使用姿勢

建議在根組件上混合進(jìn)去, 當(dāng)然,你也可以在需要的組件上去混合(不太建議, 這點(diǎn)代碼性能損耗應(yīng)該不大吧, 哈哈哈)

// src/App.vue
import fakeClickOutSide from '@/mixins/fakeClickOutSide.js'
export default {
  name: 'App',
  mixins: [fakeClickOutSide],
}

測試

常規(guī)基礎(chǔ)用法 和 自定義模板用法(模板內(nèi)沒有嵌套的標(biāo)簽) 均完美通過.

自定義模板內(nèi)如果嵌套多級標(biāo)簽, 需要在標(biāo)簽上添加標(biāo)記,然后在mousewheel事件回調(diào)里判斷是否有這個(gè)標(biāo)記.

總結(jié)

依然存在的問題(隱患):

  • 在mousewheel事件回調(diào)沒有做節(jié)流, 考慮到有鎖, 且滾輪事件觸發(fā)的頻率也不是很高(相對于mousemove事件來講), 性能消耗并不大, 遂不做節(jié)流(主要是懶).
  • 在mousewheel事件回調(diào)里,判斷event.target 是否是在popperEl元素內(nèi)部的方法感覺不是很靠譜, 且效率不高, 在mousedown 事件里判斷是不是el-select元素的方法也存在同樣的隱患, 后期再想辦法修改(修改是不可能修改的, 又不是不能用).
  • 在自定義模板用法里, 如果有嵌套的標(biāo)簽, 那么在mousewheel事件回調(diào)里判斷event.target 是不是在popperEl元素內(nèi)部的方法就崩潰了(這是個(gè)雷), 目前的解決辦法是手動(dòng)在嵌套的標(biāo)簽上都加上一個(gè)標(biāo)記, 在事件里,添加這個(gè)標(biāo)記的判斷, 但是這種做法對于已經(jīng)編寫完成的模板無效, 只能再次修改, 考慮過使用遞歸向上查找, 但是效率不高, 性能消耗太大, 且自定義el-option模板這種情況在我們現(xiàn)階段的業(yè)務(wù)中幾乎不存在, 所以就沒有考慮這個(gè)bug.

感謝一位大佬長期以來給予的幫助.

相關(guān)文章

  • Vue-cli打包后部署到子目錄下的路徑問題說明

    Vue-cli打包后部署到子目錄下的路徑問題說明

    這篇文章主要介紹了Vue-cli打包后部署到子目錄下的路徑問題說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue項(xiàng)目適配大屏端的方法示例

    vue項(xiàng)目適配大屏端的方法示例

    眾所周知在vue移動(dòng)端h5頁面當(dāng)中,適配是經(jīng)常會遇到的問題,這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目適配大屏端的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 使用vuex解決刷新頁面state數(shù)據(jù)消失的問題記錄

    使用vuex解決刷新頁面state數(shù)據(jù)消失的問題記錄

    這篇文章主要介紹了使用vuex解決刷新頁面state數(shù)據(jù)消失的問題記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • vue3中實(shí)現(xiàn)異步組件的方法實(shí)例

    vue3中實(shí)現(xiàn)異步組件的方法實(shí)例

    前端開發(fā)經(jīng)常遇到異步的問題,請求函數(shù)、鏈接庫等,下面這篇文章主要給大家介紹了關(guān)于vue3中實(shí)現(xiàn)異步組件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • VueJS實(shí)現(xiàn)用戶管理系統(tǒng)

    VueJS實(shí)現(xiàn)用戶管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了VueJS實(shí)現(xiàn)用戶管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Vue中對比scoped css和css module的區(qū)別

    Vue中對比scoped css和css module的區(qū)別

    這篇文章主要介紹了Vue中scoped css和css module的區(qū)別對比,scoped css可以直接在能跑起來的vue項(xiàng)目中使用而css module需要增加css-loader配置才能生效。具體內(nèi)容詳情大家參考下本文
    2018-05-05
  • 淺入深出Vue之組件使用

    淺入深出Vue之組件使用

    這篇文章主要給大家介紹了關(guān)于淺入深出Vue之組件使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • vue數(shù)據(jù)監(jiān)聽解析Object.defineProperty與Proxy區(qū)別

    vue數(shù)據(jù)監(jiān)聽解析Object.defineProperty與Proxy區(qū)別

    這篇文章主要為大家介紹了vue數(shù)據(jù)監(jiān)聽解析Object.defineProperty Proxy源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • vue中component組件的props使用詳解

    vue中component組件的props使用詳解

    本篇文章主要介紹了vue中component組件的props使用詳解,這里整理了詳細(xì)的用法,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • 在Vue中使用icon 字體圖標(biāo)的方法

    在Vue中使用icon 字體圖標(biāo)的方法

    這篇文章主要介紹了在Vue中使用icon 字體圖標(biāo)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06

最新評論

砚山县| 扎囊县| 奉化市| 玉门市| 馆陶县| 彰化市| 平凉市| 永寿县| 汉寿县| 通州市| 家居| 德庆县| 乌兰察布市| 桑植县| 万载县| 河间市| 西华县| 玛纳斯县| 应用必备| 奉新县| 吉首市| 丹寨县| 共和县| 建德市| 南溪县| 冕宁县| 左贡县| 阿克陶县| 新沂市| 连云港市| 梁平县| 九龙坡区| 阳山县| 上饶县| 合山市| 中西区| 于田县| 望城县| 固镇县| 基隆市| 平远县|