vue實(shí)現(xiàn)el-select 觸底分頁+遠(yuǎn)程搜索的示例
前言
大部分情況下使用 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)文章
淺談Vue.js之初始化el以及數(shù)據(jù)的綁定說明
今天小編就為大家分享一篇淺談Vue.js之初始化el以及數(shù)據(jù)的綁定說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11使用vNode實(shí)現(xiàn)給列表字段打標(biāo)簽
這篇文章主要為大家介紹了使用vNode實(shí)現(xiàn)給列表字段打標(biāo)簽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09使用iView Upload 組件實(shí)現(xiàn)手動(dòng)上傳圖片的示例代碼
這篇文章主要介紹了使用iView Upload 組件實(shí)現(xiàn)手動(dòng)上傳圖片的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10解決Vue不能檢測(cè)數(shù)組或?qū)ο笞儎?dòng)的問題
下面小編就為大家分享一篇解決Vue不能檢測(cè)數(shù)組或?qū)ο笞儎?dòng)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02Vue組件之間的參數(shù)傳遞與方法調(diào)用的實(shí)例詳解
這篇文章主要介紹了Vue組件之間的參數(shù)傳遞與方法調(diào)用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12vue?elementui?實(shí)現(xiàn)圖片上傳后拖拽排序功能示例代碼
這篇文章主要介紹了vue?elementui?實(shí)現(xiàn)圖片上傳后拖拽排序功能,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01解決vue3.0運(yùn)行項(xiàng)目warning Insert `·` prettier/pret
這篇文章主要介紹了解決vue3.0運(yùn)行項(xiàng)目warning Insert `·` prettier/prettier問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10結(jié)合Vue控制字符和字節(jié)的顯示個(gè)數(shù)的示例
這篇文章主要介紹了結(jié)合Vue控制字符和字節(jié)的顯示個(gè)數(shù)的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05