我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue如何对el-autocomplete二次封装增加下拉分页

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue如何对el-autocomplete二次封装增加下拉分页

这篇文章主要介绍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二次封装增加下拉分页”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue如何对el-autocomplete二次封装增加下拉分页

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue如何对el-autocomplete二次封装增加下拉分页

这篇文章主要介绍vue如何对el-autocomplete二次封装增加下拉分页,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!项目中的联想输入框现在都是采用的el-autocomplete实现的,但是随着数据量越来越多
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录