欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue實(shí)現(xiàn)el-select 觸底分頁+遠(yuǎn)程搜索的示例

 更新時(shí)間:2023年12月19日 11:10:33   作者:前端初見  
有的時(shí)候數(shù)據(jù)量比較大,比如幾千甚至上萬條的時(shí)候,如果直接賦值,整個(gè)頁面的 dom 會(huì)被撐爆,本文主要介紹了vue實(shí)現(xiàn)el-select 觸底分頁+遠(yuǎn)程搜索的示例,具有一定的參考價(jià)值,感興趣的可以了解一下

前言

大部分情況下使用 el-select 的時(shí)候,el-options 中 options 的值都是后端接口給的數(shù)據(jù),直接賦值就可以了。但是有的時(shí)候數(shù)據(jù)量比較大,比如幾千甚至上萬條的時(shí)候,如果直接賦值,整個(gè)頁面的 dom 會(huì)被撐爆,不僅請(qǐng)求全量數(shù)據(jù)接口的時(shí)候時(shí)間會(huì)很久,而且賦值完之后整個(gè)頁面會(huì)非常卡。
解決方案:

  • 后端將接口改為分頁的、前端將el-select下拉框中的數(shù)據(jù)改為滾動(dòng)加載
  • 后端將接口改為模糊搜索的形式,通過選擇器中輸入的內(nèi)容去搜索模糊匹配的數(shù)據(jù)然后返回;前端使用 elementUI 中el-select的遠(yuǎn)程搜索
  • 我們可以實(shí)現(xiàn)一個(gè)Vue的自定義指令,每當(dāng)使用el-select滾動(dòng)到列表底部的時(shí)候就請(qǐng)求下一頁數(shù)據(jù),來達(dá)到下拉滾動(dòng)加載更多的目的。

    在這里插入圖片描述

一、el-select 觸底分頁+遠(yuǎn)程搜索

觸底分頁

在這里插入圖片描述

遠(yuǎn)程搜索

在這里插入圖片描述

1.封裝觸底自定義指令

src目錄下創(chuàng)建 select.js,并在main.js中全局引入
代碼主要是實(shí)現(xiàn)一個(gè)el-select下拉加載的自定義指令v-loadmore:

import Vue from 'vue'
export default {}.install = (Vue, options = {}) => {
  Vue.directive('loadmore', {
    inserted(el, binding) {
      // 獲取element-ui定義好的scroll盒子
      const SELECTDOWN_DOM = el.querySelector(
        '.el-select-dropdown .el-select-dropdown__wrap'
      )
      SELECTDOWN_DOM.addEventListener('scroll', function () {
        const CONDITION =
          this.scrollHeight - this.scrollTop <= this.clientHeight
        if (CONDITION) {
          binding.value()
        }
      })
    },
  })
}

代碼說明:

  • document.querySelector:querySelector() 方法僅僅返回匹配指定選擇器的第一個(gè)元素。
  • Element.scrollHeight:在不使用滾動(dòng)條的情況下為了適應(yīng)視口中所用內(nèi)容所需的最小高度(只讀)
  • Element.scrollTop:獲取或設(shè)置一個(gè)元素的內(nèi)容垂直滾動(dòng)的像素?cái)?shù)。
  • Element.clientHeight:讀取元素的可見高度(只讀)。
  • 元素滾動(dòng)到底,下面等式返回true,沒有則返回false。
  • 警告: 在使用顯示比例縮放的系統(tǒng)上,scrollTop可能會(huì)提供一個(gè)小數(shù)。

2.在 mian.js 引入封裝好的自定義指令

在項(xiàng)目中全局注冊(cè)v-loadmore指令

import loadMore from './plugins/select'
Vue.use(loadMore)

3.在組件中進(jìn)行使用

最后在組件el-select中使用該指令

  • html部分
<el-form-item label="關(guān)聯(lián)案件:">
  <el-select
    v-model="searchParams.caseCode"
    v-loadmore="handleScroll"
    filterable
    remote
    :remote-method="remoteMethod"
  >
    <el-option
      v-for="item in ajList"
      :key="item.caseCode"
      :label="item.caseName"
      :value="item.caseCode"
    >
    </el-option>
  </el-select>
</el-form-item>
  • js部分
export default {
  data() {
    return {
      slectloading: false, //搜索下拉菜單
      ajList: [], //案件數(shù)據(jù)
      total: 0, //案件所有總數(shù)(接口返回)
      dqajtotal: 0, //當(dāng)前案件總數(shù)(每次存儲(chǔ)的長度)
    }
  },
  created() {
    this.getajnewlist() //獲取案件
  },
  methods: {
    handleScroll() {
      console.log('觸底了')
      console.log(this.dqajtotal, this.ajtotal)
      if (this.ajList.length < this.ajtotal) {
        this.slectloading = true
        this.getajnewlist() //獲取案件方法
        this.slectloading = false
      }
    },
    // 獲取案件
    getajnewlist() {
      this.selectfy.page = this.selectfy.page + 1
      console.log('頁碼', this.selectfy.page)
      this.$axios({
        url: 'case/list',
        method: 'GET',
        params: this.selectfy,
      }).then((res) => {
        if (res.code === 2000 && res.data) {
          console.log('獲取成功')
          this.ajtotal = res.data.total
          if (res.data.records && res.data.records.length > 0) {
            res.data.records.forEach((ele) => {
              var idx = this.ajList.findIndex((item) => {
                return item.caseId == ele.caseId
              })
              if (idx == -1) {
                this.ajList.push(ele)
              }
            })
          }
        } else {
          console.log(res.resultStr)
        }
        console.log(res)
      })
    },
    // 關(guān)聯(lián)案件下拉菜單遠(yuǎn)程搜索
    remoteMethod(val) {
      console.log('遠(yuǎn)程搜索', val)
      if (val && val.length > 0) {
        // 有內(nèi)容
        this.slectloading = true
        this.$axios({
          url: 'case/list',
          method: 'GET',
          params: {
            size: 10,
            caseName: val,
          },
        }).then((res) => {
          console.log('遠(yuǎn)程搜索', res)
          this.ajList = res.data.records //案件信息
          this.slectloading = false
        })
      } else {
        this.slectloading = true
        this.$axios({
          url: 'case/list',
          method: 'GET',
          params: {
            size: 10,
          },
        }).then((res) => {
          console.log(res)
          console.log('遠(yuǎn)程搜索', res)
          this.ajList = res.data.records //案件信息
          this.slectloading = false
        })
      }
    },
  },
}

4.注意

  • 傳入的數(shù)組個(gè)數(shù)必須大于或者等于8個(gè)選項(xiàng)時(shí)才能讓el-select組件出現(xiàn)下拉滾動(dòng)。
  • 列表里不存在滾動(dòng)時(shí),無法觸發(fā)傳入指令的函數(shù)。
    未對(duì) el-select 的其他參數(shù)做過多支持,如需支持,在不影響已有實(shí)例的使用的情況下,請(qǐng)直接修改組件源碼增加可選的 prop 參數(shù)即可
    當(dāng)然,在項(xiàng)目中遇到某些固定的加載請(qǐng)求時(shí),我們也可以對(duì)該組件進(jìn)行再次封裝,具體可以根據(jù)自身的業(yè)務(wù)需求進(jìn)行修改。

總結(jié)

到此這篇關(guān)于vue實(shí)現(xiàn)el-select 觸底分頁+遠(yuǎn)程搜索的示例的文章就介紹到這了,更多相關(guān)vue el-select 觸底分頁+遠(yuǎn)程搜索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論