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

vue如何實現(xiàn)el-select下拉選項的懶加載

 更新時間:2022年04月07日 15:22:44   作者:heroboyluck  
這篇文章主要介紹了vue如何實現(xiàn)el-select下拉選項的懶加載,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

下拉選擇是常用的用戶交互選擇的操作;常用固定選擇項或者動態(tài)渲染選擇項。

實際項目中存在數(shù)據(jù)量大,一次性渲染很多數(shù)據(jù)會造成下拉卡頓的問題,通過滾動懶加載,逐步增加下拉選項。

滾動加載的核心邏輯

通過監(jiān)聽容器的滾動事件,滾到最底部時,執(zhí)行加載數(shù)據(jù)函數(shù)。

interface IScrollOption {
  distance: number; // 觸發(fā)loadData事件的滾軸距底部的距離
  loadData: () => void; // 數(shù)據(jù)加載函數(shù)
}
/**
 * 處理容器滾動事件 ; 滾動到底部時,執(zhí)行處理函數(shù)
 * @param dom
 * @param option
 */
function handleScroll(dom: Element, option: IScrollOption) {
  //
  const scrollBottom = dom.scrollTop + dom.clientHeight;
  if (dom.scrollHeight - scrollBottom <= option.distance) {
    // 數(shù)據(jù)加載
    option.loadData();
  }
}

在vue中處理數(shù)據(jù)懶加載

使用Element作為UI組件,常用下拉select 方式為

<el-select v-model="selectData">
? <el-option v-for="item in data" :key="item.id" value="item.id" :label="item.name"></el-option>
</el-select>

data 為渲染數(shù)據(jù),存在大批量數(shù)據(jù)時,防止下拉卡頓,采用懶加載的方式逐步增加數(shù)據(jù)

由于el-select 組件并沒有提供內(nèi)部數(shù)據(jù)滾動的事件或者自定義內(nèi)部滾動容器DOM元素 . 只能通過F12 查看頁面結(jié)構(gòu)獲知滾動的容器DOM選擇器 .

可以通過自定義指令的方式,提取共用邏輯,不局限于select,也可用于其他列表懶加載渲染的UI組件.

/**
 * 定義懶加載數(shù)據(jù)列表的指令
 * 可通過滾動懶加載來減少一次性渲染大量數(shù)據(jù)的性能卡頓
 */
import Vue from "vue";
import { throttle } from "lodash";
export interface ILazyProps {
  loadData: () => void; // 數(shù)據(jù)加載函數(shù)
  distance: number; // 觸發(fā)函數(shù)調(diào)用的滾動距離
  scrollBody?: string; // 置頂滾動容器 , 不指定則為指令綁定元素
  callback: (fn: () => void) => void; // 自定義回調(diào)邏輯,可用于適時銷毀監(jiān)聽事件
}
Vue.directive("lazy-load", {
  /**
   * el - 指令所綁定的元素DOM
   * binding - 傳入指令的其他附帶參數(shù)
   *    name - 指令名
   *    value  - 指令綁定的值
   *    oldValue - 綁定的前一個值
   *    expression - 指令綁定的字符串形式的表達式
   *    arg - 傳給指令的參數(shù)
   *    modifiers - 指令修飾符的對象
   * vnode
   * oldVnode
   */
  inserted: (el, binding) => {
    // 獲取scroll 滾動的容器元素,由參數(shù)傳入
    // 如果沒有傳入,則默認綁定指令的元素自己
    // 獲取懶加載處理函數(shù) , 以及其他參數(shù)
    const { loadData, distance, scrollBody, callback } =
      binding.value as ILazyProps;
    let scrollContainer = el;
    if (scrollBody) {
      scrollContainer = el.querySelector(scrollBody) || el;
    }
    // 滾動事件監(jiān)聽
    const scroll = throttle(
      handleScroll.bind(null, scrollContainer, { distance, loadData }),
      500
    );
    scrollContainer.addEventListener("scroll", scroll);
    // 回調(diào)時 返回事件銷毀函數(shù)
    callback(() => {
      scrollContainer.removeEventListener("scroll", scroll);
    });
  },
});

在vue組件中使用指令 v-lazy-load

視圖,只需要添加指令.綁定指令需要的屬性值.

<el-select v-model="selectData" v-lazy-load="lazyOption">
? <el-option v-for="item in data" :key="item.id" value="item.id" :label="item.name"></el-option>
</el-select>

腳本部分 , 包括初始化layzOption 定義數(shù)據(jù)加載函數(shù) 

import { ILazyProps } from "@/directives/lazyLoad";
export default class extends Vue {
  lazyOption: ILazyProps = {
    loadData: this.loadData,
    distance: 20,
    scrollBody: ".el-scrollbar__wrap", // 為el-select 滾動容器的DOM元素的class選擇器
    callback: (fn: () => void) => {
    	// 這里是在組件銷毀前, 移除監(jiān)聽事件.
      this.$once("hook:beforeDestroy", () => fn());
    },
  };
	loadData(): void {
    this.data = this.data.concat(
      new Array(5).fill({
        id: "1009",
        name: "雙十一",
      })
    );
  }
}

Element-plus 正在新增的一個組件 el-select-v2 虛擬化列表下拉選擇器 . 虛擬列表與懶加載不同的是,虛擬列表渲染的DOM節(jié)點固定,通過滾動的位置計算需要展示的數(shù)據(jù).

Element 指令v-infinite-scroll

element 也提供了用于懶加載數(shù)據(jù)的指令v-infinite-scroll , 缺陷在于它只監(jiān)聽指令綁定的DOM元素的滾動事件.

  • infinite-scroll-disabled 是否禁用加載,如果是分頁數(shù)據(jù) , 則可以通過計算屬性pageSize*pageNum>=total
  • infinite-scroll-delay 節(jié)流加載,默認 200ms
  • infinite-scroll-distance 觸發(fā)加載的滾動距離閥值 .
  • infinite-scroll-immediate 是否立即執(zhí)行加載函數(shù),需要撐滿容器元素;否則手動請求一次數(shù)據(jù).

整個數(shù)據(jù)列表頁不需要分頁操作時, 需要通過頁面滾動來加載數(shù)據(jù)

<div v-infinite-scroll="loadData" infinite-scroll-disabled="disabled" infinite-scroll-delay="delay">
    <table
      :showPagination="false"
      :tableOption="tableOption"
      :tableColumns="tableColumns"
    ></table>
</div>

頁面滾動時調(diào)用loadData函數(shù),定義請求加載數(shù)據(jù)的邏輯.

直接貼源碼

export default {
  name: 'InfiniteScroll',
  inserted(el, binding, vnode) {
    // 綁定的回調(diào)函數(shù)
    const cb = binding.value;
		// 當(dāng)前組件實例引用
    const vm = vnode.context;
    // only include vertical scroll
    // 滾動容器DOM元素
    const container = getScrollContainer(el, true);
    // 獲取指令需要的參數(shù) delay distance immediate disabled 
    const { delay, immediate } = getScrollOptions(el, vm);
    // 滾動事件處理函數(shù),節(jié)流
    const onScroll = throttle(delay, handleScroll.bind(el, cb));
		// 將額外的計算屬性綁定到el上,在unbind 可用于移除監(jiān)聽函數(shù)
    el[scope] = { el, vm, container, onScroll };
    if (container) {
      container.addEventListener('scroll', onScroll);
      if (immediate) {
        // 容器內(nèi)元素發(fā)生節(jié)點變更時觸發(fā)執(zhí)行
        // MutationObserver API 功能調(diào)用
        const observer = el[scope].observer = new MutationObserver(onScroll);
        observer.observe(container, { childList: true, subtree: true });
        // 初始調(diào)用一次滾動加載函數(shù)
        onScroll();
      }
    }
  },
  unbind(el) {
    // 移除滾動事件
    const { container, onScroll } = el[scope];
    if (container) {
      container.removeEventListener('scroll', onScroll);
    }
  }
};
  • MutationObserver 監(jiān)視對DOM樹更改的能力

實例構(gòu)造函數(shù)接收一個回調(diào)函數(shù),為DOM發(fā)生變化時需要執(zhí)行的回調(diào)

  • observe(target,[option]) 配置需要監(jiān)聽的DOM元素,以及DOM變更的配置項
  • disconnect() 停止接收DOM變化的通知
  • takeRecords() 獲取未被回調(diào)處理的通知

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

相關(guān)文章

  • 不同場景下Vue中虛擬列表實現(xiàn)

    不同場景下Vue中虛擬列表實現(xiàn)

    虛擬列表用來解決大數(shù)據(jù)量數(shù)據(jù)渲染問題,由于一次性渲染性能低,所以誕生了虛擬列表渲染,下面我們就來學(xué)習(xí)一下不同場景下Vue中虛擬列表是如何實現(xiàn)的吧
    2023-10-10
  • Vue折疊面板組件的封裝

    Vue折疊面板組件的封裝

    這篇文章主要為大家詳細介紹了Vue折疊面板組件的封裝,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue跳轉(zhuǎn)頁面并且實現(xiàn)參數(shù)傳遞接受示例

    vue跳轉(zhuǎn)頁面并且實現(xiàn)參數(shù)傳遞接受示例

    這篇文章主要為大家介紹了vue跳轉(zhuǎn)頁面并且實現(xiàn)參數(shù)傳遞接受示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • vue-router3.x和vue-router4.x相互影響的問題分析

    vue-router3.x和vue-router4.x相互影響的問題分析

    這篇文章主要介紹了vue-router3.x和vue-router4.x相互影響的問題分析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Vue3+TypeScript封裝axios并進行請求調(diào)用的實現(xiàn)

    Vue3+TypeScript封裝axios并進行請求調(diào)用的實現(xiàn)

    這篇文章主要介紹了Vue3+TypeScript封裝axios并進行請求調(diào)用的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • vue.js+elementUI實現(xiàn)點擊左右箭頭切換頭像功能(類似輪播圖效果)

    vue.js+elementUI實現(xiàn)點擊左右箭頭切換頭像功能(類似輪播圖效果)

    這篇文章主要介紹了vue.js+elementUI實現(xiàn)點擊左右箭頭切換頭像功能(類似輪播圖),本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Vue3中按需引入ECharts詳細步驟(一看就會)

    Vue3中按需引入ECharts詳細步驟(一看就會)

    新項目采用Vue3作為前端項目框架,避免不了要使用echarts,這篇文章主要給大家介紹了關(guān)于Vue3中按需引入ECharts的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • 詳解webpack編譯多頁面vue項目的配置問題

    詳解webpack編譯多頁面vue項目的配置問題

    本篇文章主要介紹了詳解webpack編譯多頁面vue項目的配置問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Vue的v-model的幾種修飾符.lazy,.number和.trim的用法說明

    Vue的v-model的幾種修飾符.lazy,.number和.trim的用法說明

    這篇文章主要介紹了Vue的v-model的幾種修飾符.lazy,.number和.trim的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue3計算屬性computed和監(jiān)聽屬性watch區(qū)別解析

    Vue3計算屬性computed和監(jiān)聽屬性watch區(qū)別解析

    計算屬性適用于對已有的數(shù)據(jù)進行計算,派生新的數(shù)據(jù),并在模板中使用;而監(jiān)聽屬性適用于監(jiān)聽數(shù)據(jù)的變化,并執(zhí)行一些特定的操作,根據(jù)具體的需求和場景,選擇適合的機制這篇文章主要介紹了Vue3計算屬性computed和監(jiān)聽屬性watch,需要的朋友可以參考下
    2024-02-02

最新評論

涿州市| 广灵县| 双辽市| 永康市| 台东市| 永川市| 唐河县| 辉县市| 博罗县| 光山县| 大同县| 仁化县| 成武县| 庆安县| 长顺县| 英山县| 千阳县| 崇仁县| 绩溪县| 绥宁县| 乡城县| 竹山县| 栖霞市| 禹城市| 浪卡子县| 朝阳县| 平谷区| 南陵县| 长垣县| 常德市| 乌兰浩特市| 黑水县| 黔江区| 盐城市| 万荣县| 砀山县| 瑞昌市| 通江县| 罗定市| 晋宁县| 黎城县|