<el-form-item style="width:100%" label="單位" > <el-select v-model="lngcustomerid" v-selectloadmore:rangeNum="loadMore(rangeNum)" style="width:100%" clearable filterable > <el-option v-for="item in customerErpList.slice(0,rangeNum)" :key="item.lngcustomerid" :value="item.lngcustomerid" :label="item.strcustomername" /> </el-select> </el-form-item>
export default{ directives: { 'selectloadmore': { bind: function(el, binding) { // 獲取element-ui定義好的scroll盒子 const SELECTWRAP_DOM = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap') SELECTWRAP_DOM.addEventListener('scroll', function() { /** * scrollHeight 獲取元素內容高度(只讀) *scrollTop 獲取或者設置元素的偏移值,常用於, 計算滾動條的位置, 當一個元素的容器沒有產生垂直方向的滾動條, 那它的scrollTop的值默認為0 *clientHeight 讀取元素的可見高度(只讀) *如果元素滾動到底, 下面等式返回true, 沒有則返回false *ele.scrollHeight - ele.scrollTop === ele.clientHeight */ const condition = this.scrollHeight - this.scrollTop <= this.clientHeight if (condition) binding.value() }) } } }, data(){ return{ lngcustomerid:'', customerErpList:[],//假設customerErpList是一個幾千甚至上萬條的數據 rangeNum: 20 } }, methods:{ //寫法一 loadMore(n) { // eslint-disable-next-line return () => this.rangeNum += 5 }, //寫法二 loadMore(n){ var self = this return function() { self.rangeNum += 5 return self.rangeNum } }, //寫法三 loadMore(n) { return () => { this.rangeNum += 5 return this.rangeNum += 5 } }, } }
注:
以上方法適用於無搜索的情況下,
如果有搜索要求則存在問題:(1)因為第一次截取的數據是前20條,所以搜索時只能搜這20的數據,之后的搜不到 (2)同樣因為是初次只截取的數據是前20條,所以新增后比如選擇了比較靠后的一條數據保存后,編輯查看時只能顯示id值,而不是label值
所以如果要求搜索建議使用下面的方法
方法二:
<el-form-item prop="lngcustomerid" label="供應商"> <el-select v-model="saveInfo.lngcustomerid" v-el-select-loadmore:rangeNum="loadMore(rangeNum)" style="width: 260px;" clearable :filter-method="searchTextFunc" filterable @visible-change="showOptions" > <el-option v-for="item in stashList.slice(0,rangeNum)" :key="item.treedataid" :value="item.treedataid" :label="item.treedatacodeandname" /> </el-select> </el-form-item>
export default { directives: { 'el-select-loadmore': { bind(el, binding) { // 獲取element-ui定義好的scroll盒子 const SELECTWRAP_DOM = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap') SELECTWRAP_DOM.addEventListener('scroll', function() { /** * scrollHeight 獲取元素內容高度(只讀) * scrollTop 獲取或者設置元素的偏移值,常用於, 計算滾動條的位置, 當一個元素的容器沒有產生垂直方向的滾動條, 那它的scrollTop的值默認為0. * clientHeight 讀取元素的可見高度(只讀) * 如果元素滾動到底, 下面等式返回true, 沒有則返回false: * ele.scrollHeight - ele.scrollTop === ele.clientHeight; */ const condition = this.scrollHeight - this.scrollTop <= this.clientHeight if (condition) binding.value() }) } } }, data() { return { rangeNum: 20, searchText: '', stashList: [], editSelectId: 0 } },
computed: {
...mapGetters([
'customerList'
])
},
mounted() {
this.$store.dispatch('common/getCustomerList').then(() => {
this.stashList = this.customerList
})
},
methods: { loadMore(n) { // eslint-disable-next-line return () => this.rangeNum += 5 }, searchTextFunc(newVal) { if (newVal) { this.stashList = this.customerList this.stashList = this.stashList.filter(item => { if (item.treedatacodeandname.includes(newVal)) { return item } }) } else { this.stashList = this.customerList } }, showOptions(v) { if (v) { this.stashList = this.customerList this.searchText = '' } },
//查看的時候處理數據:循環比較將已經選擇的數據插到stashlist中
examine(){
if (this.editSelectId) {
var o = []
if (this.customerList.some(item => {
if (item.treedataid === this.editSelectId) {
o.push(item)
return true
}
})) {
this.stashList = this._.unionBy(o, this.stashList, 'treedataid')
}
}
}
}
}
進階:在方法二的基礎上實現拼音搜索
首先安裝PinyinMatch, 執行 npm install pinyin-match --save
const PinyinMatch = require('pinyin-match') //拼音搜索插件 export default { directives: { 'el-select-loadmore': { bind(el, binding) { // 獲取element-ui定義好的scroll盒子 const SELECTWRAP_DOM = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap') SELECTWRAP_DOM.addEventListener('scroll', function() { /** * scrollHeight 獲取元素內容高度(只讀) * scrollTop 獲取或者設置元素的偏移值,常用於, 計算滾動條的位置, 當一個元素的容器沒有產生垂直方向的滾動條, 那它的scrollTop的值默認為0. * clientHeight 讀取元素的可見高度(只讀) * 如果元素滾動到底, 下面等式返回true, 沒有則返回false: * ele.scrollHeight - ele.scrollTop === ele.clientHeight; */ const condition = this.scrollHeight - this.scrollTop <= this.clientHeight if (condition) binding.value() }) } } }, data() { return { rangeNum: 20, searchText: '', stashList: [], editSelectId: 0 } }, computed: { ...mapGetters([ 'customerList' ]) }, mounted() { this.$store.dispatch('common/getCustomerList').then(() => { this.stashList = this.customerList }) }, methods: { loadMore(n) { // eslint-disable-next-line return () => this.rangeNum += 5 }, searchTextFunc(newVal) { if (newVal) { //拼音搜索方法 this.stashList = this.customerList.filter((item) => { return PinyinMatch.match(item.treedatacodeandname, newVal) }) } else { this.stashList = this.customerList } }, showOptions(v) { if (v) { this.stashList = this.customerList this.searchText = '' } }, //查看的時候處理數據:循環比較將已經選擇的數據插到stashlist中 examine(){ if (this.editSelectId) { var o = [] if (this.customerList.some(item => { if (item.treedataid === this.editSelectId) { o.push(item) return true } })) { this.stashList = this._.unionBy(o, this.stashList, 'treedataid') } } } } }
參考:https://blog.csdn.net/sunnyboysix/article/details/106792693
pinyinMatch使用參考:https://www.npmjs.com/package/pinyin-match、https://www.cnblogs.com/hellofangfang/p/10906986.html