91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue如何對el-autocomplete二次封裝增加下拉分頁

發布時間:2022-03-08 14:43:24 來源:億速云 閱讀:941 作者:小新 欄目:開發技術

這篇文章主要介紹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>

下面對主要的地方進行講解。

1.自定義指令實現下拉加載更多。

主要代碼

// 自定義指令,監聽下拉框的滾動,滾動到底部就加載下一頁
    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來節流。

2.增加props(getOptionFn、searchKey、value、placeholder)抽離業務。成為公共組件

  • getOptionFn為接口封裝的方法。fetch-suggestions和加載更多里面都要用到

  • searchKey表示接口需要傳的參數的key,不同的接口的key可能不一致。

  • value是外面v-modle的綁定值,注意在watch里面設置值,不知道的可以看看v-model的實現原理。

  • placeholder不解釋

3.可能需要解釋的

  • 在加載到更多數據后怎么把輸入加到下拉里面?

this.$refs['autocomplete'].$data.suggestions // 下拉的列表
  • 怎么避免加載完了還加載更多。

這里是用的數量比較,也可以加一個標識符,加載完了設置為true,變化條件后設為false。

if(Number(this.pageTotal) <= this.$refs['autocomplete'].$data.suggestions.length) {
    return
  }

以上是“vue如何對el-autocomplete二次封裝增加下拉分頁”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

成武县| 娄底市| 准格尔旗| 洛扎县| 庆城县| 新余市| 高密市| 南岸区| 巢湖市| 肥东县| 涞水县| 澄迈县| 文昌市| 周宁县| 林芝县| 岱山县| 永川市| 廊坊市| 伊春市| 巴南区| 拜城县| 贡山| 德清县| 阳谷县| 师宗县| 凯里市| 边坝县| 陇川县| 上林县| 株洲县| 兰西县| 平潭县| 缙云县| 务川| 华亭县| 沅陵县| 通海县| 平果县| 淮滨县| 阳原县| 剑阁县|