vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label)

这篇具有很好参考价值的文章主要介绍了vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、效果图

vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label),vue2基于Ant-Design-vue基础组件封装,vue.js,前端,ant-design-vue,a-select,select,option,封装

二、参数配置

1、代码示例

<t-antd-select
  v-model="selectVlaue"
  :optionSource="stepList"
  @change="selectChange"
/>

2、配置参数(Attributes)继承 a-select Attributes

参数 说明 类型 默认值
v-model 绑定值 boolean / string / number/Array -
mode 设置’multiple’'tags’多选 (显示全选) String -
optionSource 下拉数据源 Array -
width select宽度(可以设置百分比或px) String 100%
customLabel 是否自定义设置下拉label String -
valueKey 传入的 option 数组中,要作为最终选择项的键值 key String ‘key’
labelKey 传入的 option 数组中,要作为显示项的键值名称 String ‘label’
isShowPagination 是否显示分页(分页不显示全选框) Boolean false
paginationOption 分页配置项 Object -

2-1、paginationOption配置参数(Attributes)继承 a-pagination Attributes

参数 说明 类型 默认值
current 当前页数 number 1
pageSize 每页显示条目个数 number 6
total 总条目数 number 0
bind 继承a-pagination属性 Object -

3、继承 a-select&&a-pagination events

事件名 说明 返回值
current-change 当前页码 当前选中的页码

三、源码

<template>
  <div @mousedown="e => {
    e.preventDefault()
    selectOpen = true
  }" ref="main">
    <a-select
      class="t_select"
      v-model="childSelectedValue"
      :style="{width: width||'100%'}"
      :placeholder="placeholder"
      :open="selectOpen"
      @select="handleSelect"
      v-bind="attrs"
      v-on="$listeners"
      :mode="mode"
    >
      <template v-for="(index, name) in $slots" v-slot:[name]>
        <slot :name="name" />
      </template>
      <template v-for="(index, name) in $scopedSlots" v-slot:[name]="data">
        <slot :name="name" v-bind="data"></slot>
      </template>
      <div slot="dropdownRender" slot-scope="menu">
        <a-checkbox
          v-if="mode&&!isShowPagination"
          :checked="selectChecked"
          @change="selectAll"
          class="all_checkbox"
        >全选</a-checkbox>
        <v-nodes :vnodes="menu" />
        <div class="t_select__pagination" v-if="isShowPagination">
          <a-pagination
            :page-size.sync="paginationOption.pageSize"
            v-model="paginationOption.current"
            :total="paginationOption.total"
            @change="currentChange"
            v-bind="{
            size:'small',
            'hide-on-single-page':true,
            'showQuickJumper': true,
            ...$attrs,
            ...paginationOption.bind,
          }"
            v-on="$listeners"
          />
        </div>
      </div>
      <a-select-option
        v-for="(item,index) in optionSource"
        :key="index"
        :value="item[valueKey]"
      >{{customLabel?customLabelHandler(item):item[labelKey]}}</a-select-option>
    </a-select>
  </div>
</template>
<script>
export default {
  name: 'TAntdSelect',
  components: {
    VNodes: {
      functional: true,
      render: (h, ctx) => ctx.props.vnodes
    }
  },
  props: {
    value: {
      type: [String, Number, Array, Boolean, Object]
    },
    // 多选 'multiple'
    mode: {
      type: String
    },
    placeholder: {
      type: String,
      default: '请选择'
    },
    // 选择框宽度
    width: {
      type: String
    },
    // 是否自定义设置下拉label
    customLabel: {
      type: String
    },
    // 传入的option数组中,要作为最终选择项的键值key
    valueKey: {
      type: String,
      default: 'key'
    },
    // 传入的option数组中,要作为显示项的键值名称
    labelKey: {
      type: String,
      default: 'label'
    },
    // 下拉框组件数据源
    optionSource: {
      type: Array
    },
    // 是否显示分页
    isShowPagination: {
      type: Boolean,
      default: false
    },
    // 分页配置项
    paginationOption: {
      type: Object,
      default: () => {
        return {
          pageSize: 6, // 每页显示条数
          current: 1, // 当前页
          total: 0 // 总条数
        }
      }
    }
  },
  data() {
    return {
      selectOpen: false
    }
  },
  computed: {
    childSelectedValue: {
      get() {
        return this.value || undefined
      },
      set(val) {
        this.$emit('input', val)
      }
    },
    attrs() {
      return {
        allowClear: true,
        showSearch: true,
        ...this.$attrs
      }
    },
    selectChecked: {
      get() {
        return this.childSelectedValue?.length === this.optionSource?.length
      },
      set(val) {
        // console.log('set', val)
        this.$emit('input', val)
      }
    }
  },
  mounted() {
    document.addEventListener('click', this.bodyCloseMenus)
  },
  beforeDestroy() {
    document.removeEventListener('click', this.bodyCloseMenus)
  },
  methods: {
    // 点击空白区域
    bodyCloseMenus(e) {
      if (this.$refs.main && !this.$refs.main.contains(e.target)) {
        if (this.selectOpen == true) {
          this.selectOpen = false
        }
      }
    },
    // 点击全选
    selectAll(val) {
      const options = JSON.parse(JSON.stringify(this.optionSource))
      if (val.target.checked) {
        this.childSelectedValue = options?.map(item => {
          return item[this.valueKey]
        })
        setTimeout(() => {
          this.$emit('change', this.childSelectedValue)
        }, 0)
      } else {
        this.childSelectedValue = null
      }
      this.selectOpen = false
    },
    handleSelect(value, option) {
      if (value) {
        this.selectOpen = false
      }
      this.$emit('select', value, option)
    },
    // 切换分页
    currentChange(val) {
      // console.log('切换分页', val)
      if (!this.mode) {
        this.childSelectedValue = null
      }
      setTimeout(() => {
        this.selectOpen = true
      }, 0)
      this.$emit('current-change', val)
    },
    // 自定义label显示
    customLabelHandler(item) {
      // eslint-disable-next-line no-eval
      return eval(this.customLabel)
    }
  }
}
</script>
<style lang="scss">
.all_checkbox {
  margin-left: 12px;
  margin-top: 5px;
}
</style>

四、组件地址

gitHub组件地址

gitee码云组件地址

五、相关文章

基于ElementUi再次封装基础组件文档


基于ant-design-vue再次封装基础组件文档


vue3+ts基于Element-plus再次封装基础组件文档文章来源地址https://www.toymoban.com/news/detail-715903.html

到了这里,关于vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • [ant-design-vue] table组件列宽拖拽功能

    原有的样式文件没有使用的必要,个人添加的部分样式内容就符合需求了 vue3.x对应的ant-design-vue中的table组件本身支持列宽的拖动了,不需求额外的包的支持,根据Api说明设置resizeColumn即可

    2024年01月23日
    浏览(49)
  • ant-design-vue中table组件使用customRender渲染v-html

    ant-design-vue遇到table中列表数据需要高亮渲染 1、customRender可以使用,但是使用v-html发现不生效还报错 2、customRender函数返回肯定是jsx语法,于是发现这样写可以

    2024年02月15日
    浏览(52)
  • vue3中使用ant-design-vue的layout组件实现动态导航栏功能(1~2级)

    目录 0 前言 1 准备工作 1.1 安装ant-design-vue 1.2 安装图标组件包 2 选择组件 3 路由文件 4 Vue导航页面 5 最终效果         最近在自己搞一个前后端小项目,前端想使用ant-design-vue的layout组件实现动态导航栏和面包屑,但是网上的资料较少,所以我就自己整合实现了一下,在此

    2024年02月15日
    浏览(41)
  • ant-design-vue在ios使用AUpload组件唤起了相机,HTML的 `capture` 属性

    在使用ant design vue组件的上传组件AUpload的时候有一个问题,直接按照demo写,在ios上会唤起相机,但是实际上我们的需求是弹出选择相册/相机这个弹框。 解决办法是加一个 cupture=\\\"null\\\"这个属性即可 HTML attribute: capture - HTML: HyperText Markup Language | MDN The capture attribute specifies that

    2024年02月12日
    浏览(46)
  • html中如何用vue语法,并使用UI组件库 ,html中引入vue+ant-design-vue或者vue+element-plus

    前言 先说一下本次应用的场景,本次项目中,需要引入github中别人写好的插件,插件比较大,没有方法直接在自己项目中,把别人的项目打包合并生成html(类似于前端项目打包生成的 dist ),修改这里面的html,这种情况要么用原生js写或者jquery还相对快一些,那为什么不直

    2024年02月10日
    浏览(51)
  • 关于 ant-design-vue resetFields 失效

    关于 ant-design-vue resetFields 失效 背景: 遇到这样的问题使用 ant-design-vue useForm 来制作表单的时候, resetFields()失效 场景: 编辑 -赋值 新增 -初始值(问题点:新增的时候他就不 初始化 ) 方案: 1、调用 resetFields() 传参 2、要么使用 reactive 明确定义初始值 解释: 首先我这里讲

    2024年01月17日
    浏览(47)
  • ant-design-vue 自由切换 暗黑模式dark

    思路 引入 dark.css 文件 动态切换 prefixCls 实现效果 我们来看看官网怎么说的 官网地址 除了 less 定制主题 外,我们还提供了 CSS Variable 版本以支持动态切换主题能力。你可以在 ConfigProvider 进行体验。 调用 ConfigProvider 配置方法设置主题色: 默认情况下,CSS Variable 会以 --ant 作

    2023年04月21日
    浏览(46)
  • 如何vue使用ant design Vue中的select组件实现下拉分页加载数据,并解决存在的一个问题。

        需求:拉下菜单中数据过多,200条以上,就会导致select组件卡死。所以需要使用滑动到底部使其分页加载     可以借助 onPopupScroll 事件来监听下拉菜单的滚动事件,并判断当前是否已经到达了下拉菜单底部。具体可以通过以下步骤实现:     1、在组件中绑定 @popupScro

    2023年04月20日
    浏览(52)
  • 国际化配置(ant-design-vue设置成中文)

    vue3 + ts + ant-design-vue 引用ant-design-vue的组件时,默认是英文的。 官网说明:https://www.antdv.com/components/date-picker-cn   我用的全局设置。在项目的App.vue文件里引入ant-design-vue自带的zh_CN,用a-config-provider 将RouterView包裹起来。但是我发现设置了全局,在使用日期选择框时还是英文,

    2024年02月22日
    浏览(51)
  • ant-design-vue表格Table行内新增、编辑、删除

    ant-design-vue表格Table进行单元格内新增、编辑、删除等操作 如图所示:

    2024年02月14日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包