vue實現(xiàn)el-select 觸底分頁+遠程搜索的示例
前言
大部分情況下使用 el-select 的時候,el-options 中 options 的值都是后端接口給的數(shù)據(jù),直接賦值就可以了。但是有的時候數(shù)據(jù)量比較大,比如幾千甚至上萬條的時候,如果直接賦值,整個頁面的 dom 會被撐爆,不僅請求全量數(shù)據(jù)接口的時候時間會很久,而且賦值完之后整個頁面會非???。
解決方案:
- 后端將接口改為分頁的、前端將el-select下拉框中的數(shù)據(jù)改為滾動加載
- 后端將接口改為模糊搜索的形式,通過選擇器中輸入的內(nèi)容去搜索模糊匹配的數(shù)據(jù)然后返回;前端使用 elementUI 中el-select的遠程搜索
- 我們可以實現(xiàn)一個Vue的自定義指令,每當使用el-select滾動到列表底部的時候就請求下一頁數(shù)據(jù),來達到下拉滾動加載更多的目的。
一、el-select 觸底分頁+遠程搜索
觸底分頁
遠程搜索
1.封裝觸底自定義指令
src目錄下創(chuàng)建 select.js,并在main.js中全局引入
代碼主要是實現(xiàn)一個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() 方法僅僅返回匹配指定選擇器的第一個元素。
- Element.scrollHeight:在不使用滾動條的情況下為了適應視口中所用內(nèi)容所需的最小高度(只讀)
- Element.scrollTop:獲取或設置一個元素的內(nèi)容垂直滾動的像素數(shù)。
- Element.clientHeight:讀取元素的可見高度(只讀)。
- 元素滾動到底,下面等式返回true,沒有則返回false。
- 警告: 在使用顯示比例縮放的系統(tǒng)上,scrollTop可能會提供一個小數(shù)。
2.在 mian.js 引入封裝好的自定義指令
在項目中全局注冊v-loadmore指令
import loadMore from './plugins/select' Vue.use(loadMore)
3.在組件中進行使用
最后在組件el-select中使用該指令
- html部分
<el-form-item label="關聯(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, //當前案件總數(shù)(每次存儲的長度) } }, 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) }) }, // 關聯(lián)案件下拉菜單遠程搜索 remoteMethod(val) { console.log('遠程搜索', 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('遠程搜索', 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('遠程搜索', res) this.ajList = res.data.records //案件信息 this.slectloading = false }) } }, }, }
4.注意
- 傳入的數(shù)組個數(shù)必須大于或者等于8個選項時才能讓el-select組件出現(xiàn)下拉滾動。
- 列表里不存在滾動時,無法觸發(fā)傳入指令的函數(shù)。
未對 el-select 的其他參數(shù)做過多支持,如需支持,在不影響已有實例的使用的情況下,請直接修改組件源碼增加可選的 prop 參數(shù)即可
當然,在項目中遇到某些固定的加載請求時,我們也可以對該組件進行再次封裝,具體可以根據(jù)自身的業(yè)務需求進行修改。
總結
到此這篇關于vue實現(xiàn)el-select 觸底分頁+遠程搜索的示例的文章就介紹到這了,更多相關vue el-select 觸底分頁+遠程搜索內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談Vue.js之初始化el以及數(shù)據(jù)的綁定說明
今天小編就為大家分享一篇淺談Vue.js之初始化el以及數(shù)據(jù)的綁定說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11使用iView Upload 組件實現(xiàn)手動上傳圖片的示例代碼
這篇文章主要介紹了使用iView Upload 組件實現(xiàn)手動上傳圖片的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10Vue組件之間的參數(shù)傳遞與方法調(diào)用的實例詳解
這篇文章主要介紹了Vue組件之間的參數(shù)傳遞與方法調(diào)用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12vue?elementui?實現(xiàn)圖片上傳后拖拽排序功能示例代碼
這篇文章主要介紹了vue?elementui?實現(xiàn)圖片上傳后拖拽排序功能,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01解決vue3.0運行項目warning Insert `·` prettier/pret
這篇文章主要介紹了解決vue3.0運行項目warning Insert `·` prettier/prettier問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10結合Vue控制字符和字節(jié)的顯示個數(shù)的示例
這篇文章主要介紹了結合Vue控制字符和字節(jié)的顯示個數(shù)的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05