基于Element-ui 封装带分页的下拉选择器组件

这篇具有很好参考价值的文章主要介绍了基于Element-ui 封装带分页的下拉选择器组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用 Element-ui的 el-select组件时,如果下拉选项过多,一是查找选项困难,二是数据量超大(比如1w+)组件直接会卡死,所以考虑做一个带分页的下拉选择器(样式还可以再优化)

效果图

vue element-ui 下拉列表分页,Vue,前端,ui,vue.js,javascriptvue element-ui 下拉列表分页,Vue,前端,ui,vue.js,javascript文章来源地址https://www.toymoban.com/news/detail-667893.html

组件代码

<template>
  <el-select
    :size="size"
    v-model="value"
    @change="handleChange">
    <div v-loading="loading">
      <el-input
        class="select-input"
        :size="size"
        prefix-icon="el-icon-search"
        :placeholder="placeholder"
        v-model="filterText"
        @change="handleFilter">
      </el-input>
      <el-option
        value=""
        label="全部" />
      <el-option
        v-for="o in options"
        :key="o[value]"
        :label="o[props.label]"
        :value="o[props.value]" />
      <el-pagination
        v-if="pagination.show"
        class="mt12 w100 base select-pagination"
        @current-change="handleCurrentChange"
        :current-page.sync="pagination.current"
        :page-size="pagination.size"
        :layout="pagination.layout"
        :total="pagination.total" />
      <p v-if="pagination.show" class="page-size">10/</p>
    </div>
  </el-select>
</template>

<script>
export default {
  props: {
    props: {
      type: Object,
      default: () => ({
        label: 'label',
        value: 'value',
      }),
    },
    options: {
      type: Array,
      default: () => [],
    },
    placeholder: {
      type: String,
      default: '搜索',
    },
    size: {
      type: String,
      default: 'small',
    },
    pagination: {
      type: Object,
      default: () => ({
        show: true,
        current: 1,
        size: 10,
        total: 0,
        layout: 'prev, next',
      }),
    },
    loading: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      value: '',
      filterText: '',
    };
  },
  mounted() {
  },
  methods: {
    // 初始化数据
    initData() {
      this.value = '';
      this.filterText = '';
    },
    // 切换页码
    handleCurrentChange() {
      this.$emit('getOptions');
    },
    // 切换选项
    handleChange() {
      this.$emit('selectValue', this.value);
    },
    // 筛选选项
    handleFilter() {
      this.$emit('getOptions', this.filterText);
    },
  },
};
</script>

<style lang="scss" scoped>
  .select-input{
    padding: 0 12px;
    box-sizing: border-box;
    margin-bottom: 12px;
    ::v-deep .el-input__inner {
      border: none;
      border-bottom: 1px solid #EBEBEB;
      border-radius: 0;
    }
  }
  .select-pagination {
    text-align: center;
    ::v-deep .btn-prev {
      padding-right: 30px;
      .el-icon::before {
        content: "\e792",
      }
    }
    ::v-deep .btn-next {
      padding-left: 30px;
      .el-icon::before {
        content: "\e791",
      }
    }
  }
  .page-size {
    color: $color-text;
    font-size: 12px;
    height: 32px;
    line-height: 32px;
    text-align: center;
    margin-top: -32px;
  }
</style>

父组件调用

<template>
	<PaginationSelect
       ref="paginationSelect"
       :props="{ label: 'name', value: 'id' }"
       :options="optionList"
       :pagination="pagination"
       :loading="loading"
       @getOptions="getOptionList"
       @selectValue="selectData" />
</template>
<script>
export default {
  data() {
    return {
      optionList: '',
      dataSelected: null,
      pagination: {
      	show: true,
        current: 1,
        size: 10,
        total: 0,
        layout: 'prev, next',
      },
      loading:'',
    };
  },
  mounted() {
  },
  methods: {
    // 分页请求下拉选项
    getOptionList(keyword) {
      this.loading = true
      const { current, size } = this.pagination
      const params = {
      	keyword,
        current,
       	size,
      };
      requestApi(params).then(res => {
      	if (res.code === '200') {
          const { list, total } = res.data;
          this.optionList = list;
          this.pagination.total = total;
        } else {
          this.$message.error(res.message || '获取下拉选项失败');
        }
      }).finally(() => {
      	this.loading = false
      })
    },
    // 选中下拉选项
    selectData(val) {
      this.dataSelected = val;
    },
  },
};
</script>

到了这里,关于基于Element-ui 封装带分页的下拉选择器组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • element-ui 切换分页条数,触发两次请求-bug记录, 分页组件封装

    前言介绍: 以组件完整功能为例需要配置的参数为current-page、page-sizes、page-size、total: current-page,文档所指为当前页数;显示当前数据所拥有页数 page-sizes,文档所指为每页显示个数选择器的选项设置;对当前页数据显示个数进行配置(以数组形式进行配置,例:[10, 20, 30,

    2024年02月08日
    浏览(33)
  • 基于Element-ui 表单弹窗列表选择封装

    不知道怎么描述这个东西了。。el-select下拉框大家都知道,但是下拉框只能选择一个,而且如果数据太多的话也不太容易选择,所以这里就是封装了组件包含对应的弹窗,就是能实现多选,而且列表也是分页展示的,选择完之后将对应的名称展示在文本框中,传给后端对应的

    2024年02月11日
    浏览(26)
  • 基于element-ui封装上传图片到腾讯云Cos组件

    组件需求 上传图片到腾讯云Cos服务器 可以显示传入的图片地址 可以删除传入的图片地址 可以上传图片到云服务器 上传到腾讯云之后,可以返回图片地址,显示 上传成功之后,可以回调成功函数 需要使用借助一个插件,帮助我们上传图片资源到腾讯云Cos 使用element的el-upl

    2023年04月17日
    浏览(78)
  • 基于Element-ui 封装穿梭框(左侧树 右侧列表,可全选,列表可拖拽)

    Element-ui提供的穿梭框只支持列表,根据实际需求自己写了一个左边是树结构,右边是列表结构的穿梭框,(如果需要两边都是树结构的话,需要把右侧的逻辑参考左侧改一改)拖拽使用了 vuedraggable 插件

    2024年02月11日
    浏览(38)
  • 基于element-ui el-dialog组件封装,可缩放+可移动的弹窗组件

    源码下载 改组件继承el-dialog组件百分之95属性,可直接对el-dialog进行替换。在项目中我的命名为: vue代码 :搞成组件,路径随意,推荐统一放在组件目录下 拖动及缩放操作js代码: 将skdialog.js注册为指令: 目录: 指令使用:(v-指令名称(SkDialogDrag)) 效果图: 注:吃水

    2024年02月03日
    浏览(39)
  • element-ui输入框下拉远程搜索

    实现效果: 可以在你输入的时候出现一个下拉,将你输入的东西与下拉框的内容进行匹配,然后下拉框会显示匹配的内容  相关代码: :fetch-suggestions=\\\"querySearchAsync\\\"是定义下拉内容的函数方法,restaurants是下拉框的内容,timeout这个定时器使用来决定多少秒后显示筛选后的内容

    2024年02月05日
    浏览(31)
  • element-ui 下拉选择同时可输入

    element-ui在下拉选择的同时可以输入,看官方文档的时候,发现只有allow-create勉强符合需求,可以创建并选中选项中不存在的条目,但是不能满足输入失焦以后就是输入的值,搜了网上一圈,终于找到了答案~使用blur:

    2024年02月17日
    浏览(26)
  • 基于vue element-ui 封装上传图片组件 功能:上传,删除,预览,上传图片水印,拖拽排序,上传进度条等

    我们在开发后台时肯定避免不了上传图片的功能 例如: 上传图片回显 上传完成 : 预览查看 , 删除等 如果是图片列表,还可能让你拖动图片排序 有的后台项目可能要给图片添加水印,添加标记 有的后台可能要炫酷一点 添加进度条功能 现在我们要完成上面的一系列功能,这里我

    2024年02月16日
    浏览(44)
  • element-ui 分页刷新无效问题

    问题:在列表页跳转至详情页,再从详情页回到列表,分页列表停留在第一页,数据不刷新问题。 先设置设置当前的页码绑定 current-page.sync=\\\"page\\\" 给分页组件设置v-if=\\\"showPage\\\" 3.在data里面设置 showPage为ture 4.在点击切换分页方法时,先设置this.showPage = false;再使用 $nextTick回调方

    2024年02月13日
    浏览(29)
  • vue+element-ui 实现下拉框滚动加载

    该功能是由 自定义滚动指令 结合下拉框 :remote-method 远程搜索 实现的 开启远程搜索 参考官方文档 绑定自定义指令 v-el-select-loadmore=“loadmore”

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包