您好,登錄后才能下訂單哦!
這篇文章主要介紹vue如何對el-autocomplete二次封裝增加下拉分頁,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
項目中的聯想輸入框現在都是采用的el-autocomplete實現的,但是隨著數據量越來越多,產品要求一次不要返回所有的聯想數據,要做分頁處理,所以需要添加一個分頁的功能。
注:看懂下面的代碼需要先對vue和element有一定的學習。
完整代碼
<template> <el-autocomplete ref="autocomplete" value-key="value" v-scrollLoad="selectLoadMore" v-loading="loading" v-model="state" :fetch-suggestions="querySearch" :placeholder="placeholder" :trigger-on-focus="false" @select="handleSelect" ></el-autocomplete> </template> <script> export default { name: 'InputLoadMore', props: { // 封裝的查數據方法 getOptionFn: { require: true }, // 后端定義的聯想的key searchKey: { type: String, require: true }, // v-model的綁定值 value: { type: String, require: true }, // placehoder placeholder: { type: String, default: '請輸入' } }, data() { return { state: '', loading: false, page: 1, pageTotal: 0 } }, watch: { state(val) { this.$emit('input', val) }, value(val) { this.state = val } }, directives: { // 自定義指令,監聽下拉框的滾動,滾動到底部就加載下一頁 scrollLoad: { bind(el, binding, vnode) { let wrapDom = el.querySelector('.el-autocomplete-suggestion__wrap') let listDom = el.querySelector('.el-autocomplete-suggestion__wrap .el-autocomplete-suggestion__list') wrapDom.addEventListener( 'scroll', e => { // 注意load的使用,節流 let condition = wrapDom.offsetHeight + wrapDom.scrollTop + 10 - listDom.offsetHeight if (condition > 0 && !vnode.context.loading) { //滾動到底部則執行滾動方法load,binding.value就是v-scrollLoad綁定的值,加()表示執行綁定的方法 binding.value() } }, false ) } } }, methods: { async querySearch(queryString, cb) { this.page = 1 this.loading = true try { let { result } = await this.getOptionFn({ page: 1, pageSize: 50, [this.searchKey]: queryString }) // 根據實際情況修改下面的代碼,展示數據 if (result.rows) { let arr = [] result.rows.forEach(item => { arr.push({ value: item }) }) cb(arr) } else { cb([]) } this.pageTotal = result.total || 0 } catch(e) { // console.log(e) } finally { this.loading = false } }, handleSelect(item) {}, // 加載更多 async selectLoadMore() { if(Number(this.pageTotal) <= this.$refs['autocomplete'].$data.suggestions.length) { return } this.page = this.page + 1 this.loading = true try { let { result } = await this.getOptionFn({ page: this.page, pageSize: 50, [this.searchKey]: this.state }) // 根據實際情況修改下面的代碼,展示數據 if (result.rows) { const arr = result.rows.map(item => { return { value: item } }) // 將數據添加到下拉列表 this.$refs['autocomplete'].$data.suggestions = this.$refs['autocomplete'].$data.suggestions.concat(arr) } this.pageTotal = result.total || 0 } catch(e) { // console.log(e) } finally { this.loading = false } } } } </script> </script>
下面對主要的地方進行講解。
主要代碼
// 自定義指令,監聽下拉框的滾動,滾動到底部就加載下一頁 scrollLoad: { bind(el, binding, vnode) { let wrapDom = el.querySelector('.el-autocomplete-suggestion__wrap') let listDom = el.querySelector('.el-autocomplete-suggestion__wrap .el-autocomplete-suggestion__list') wrapDom.addEventListener( 'scroll', e => { // 注意load的使用,節流 let condition = wrapDom.offsetHeight + wrapDom.scrollTop + 10 - listDom.offsetHeight if (condition > 0 && !vnode.context.loading) { //滾動到底部則執行滾動方法load,binding.value就是v-scrollLoad綁定的值,加()表示執行綁定的方法 binding.value() } }, false ) }
上面主要是運用了vue的自定義指令的bind鉤子。不太了解的可以先看這個https://cn.vuejs.org/v2/guide/custom-directive.html 。bind有四個參數(el、binding、vnode、oldVnode)這里用前三個,el代表綁定的元素,用來操作dom,這里用來添加scroll事件,以及計算下拉框是否滑動到底部(注意計算中的+10高度);binding是一個對象,包含舊值、新值、指令名等,這里主要用綁定值value,用來執行加載更多的方法;Vnode指的是虛擬節點,這里取他的context即為this控制loading來節流。
getOptionFn為接口封裝的方法。fetch-suggestions和加載更多里面都要用到
searchKey表示接口需要傳的參數的key,不同的接口的key可能不一致。
value是外面v-modle的綁定值,注意在watch里面設置值,不知道的可以看看v-model的實現原理。
placeholder不解釋
在加載到更多數據后怎么把輸入加到下拉里面?
this.$refs['autocomplete'].$data.suggestions // 下拉的列表
怎么避免加載完了還加載更多。
這里是用的數量比較,也可以加一個標識符,加載完了設置為true,變化條件后設為false。
if(Number(this.pageTotal) <= this.$refs['autocomplete'].$data.suggestions.length) { return }
以上是“vue如何對el-autocomplete二次封裝增加下拉分頁”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。