Vue3+Ant design 实现Select下拉框一键全选/清空

最近在做后台管理系统项目的时候,产品增加了一个让人非常苦恼的需求,让在Select选择器中添加一键全选和清空的功能,刚开始听到的时候真是很懵,他又不让在外部增加按钮,其实如果说在外部增加按钮实现全选或者清空的话,功能相对来说还是比较简单的。咱也是没办法啊公司的牛马,只能按照需求来修改了。好在通过查找了资料自己又进行了总结之后,实现了让人恼火的需求,因为在查找资料的时候发现对于这一块的知识点,网上的还是少之又少的,基本上都是vue2的方式,所以咱既然已经实现了,就分享给大家一起共享咯。

一、搭建页面

在项目中安装和引用ant design组件这里就不在细说了,前面的很多案例中都有讲解这一块,不会的小伙伴可以进行查看即可,当然去ant design官网也有这些操作哦。

<template>
    <div class="test">
        <a-form-item label="营运单位" style="width: 16vw; margin: 15px">
          <a-select
            mode="multiple"
            :max-tag-count="1"
            allowClear
            v-model:value="valueGlc"
            @change="changeUnit"
            :options="optionsGlc"
          >
            <template #maxTagPlaceholder="omittedValues">
              <span class="allSelsct" v-if="optionsGlc.length === omittedValues.length + 1">全选</span>
              <span v-else>+ {{ omittedValues.length }} ...</span>
            </template>
            <!-- 全选---这里就是实现一键全选和清空的细节操作 -->
            <template #dropdownRender="{ menuNode: menu }">
              <v-nodes :vnodes="menu" />
              <a-divider style="margin: 4px 0" />
              <div style="padding: 4px 8px; margin-left: 50px; cursor: pointer" @mousedown="e => e.preventDefault()">
                <a-button type="link" @click="selectAll">全选</a-button>
                <a-button type="link" @click="clearAll">清空</a-button>
              </div>
            </template>
          </a-select>
        </a-form-item>
    </div>
</template>

<script setup>
//所选择的营运单位
const valueGlc=ref('')
//营运单位选项列表
const optionsGlc=ref([])
//下拉菜单组件不可少,不然后续不显示菜单
const VNodes = (_, { attrs }) => {
  return attrs.vnodes
}
//选择营运单位事件
const changeUnit=()=>{}
// 一键全选
const selectAll=()=>{}
// 一键清空
const clearAll=()=>{}
</script>

<style lang='less' scoped>
.test{}
</style>

二、获取select菜单中的数据

提示: 在这里获取数据是使用了公司封装后的框架

<script setup>
//来源于封装后的数据地址--仅供参考
import { selectorRoadDeptLists } from '@/api/tjfx.js'
//所选择的营运单位
const valueGlc=ref('')
//营运单位选项列表
const optionsGlc=ref([])
//下拉菜单组件不可少,不然后续不显示菜单
const VNodes = (_, { attrs }) => {
  return attrs.vnodes
}
//选择营运单位事件
const changeUnit=()=>{}
// 一键全选
const selectAll=()=>{}
// 一键清空
const clearAll=()=>{}
// 获取下拉框数据-营运单位
const getOptionsGlc = () => {
  return new Promise((resolve, reject) => {
    selectorRoadDeptLists()
      .then(res => {
        if (res.code === 200 && res.data) {
          res.data.forEach((item, index) => {
            optionsGlc.value.push({
              value: item.code,
              code: item.code,
              label: item.name
            })
            valueGlc.value.push(item.code)
          })
        }
      })
  })
}
onMounted(() => {
    getOptionsGlc()
})

三、一键全选

在操作完以上的步骤后,select中已经有对应的数据了,但是最重要的步骤还未实施,下面是实现一键全选的代码

// 一键全选
const selectAll=()=>{
    valueGlc.value = optionsGlc.value.map(option => option.value)
}

 

四、一键清空

// 一键清空
const clearAll=()=>{
    valueGlc.value = []
}

 

五、详细代码

以上就是实现一键全选和一键清空的详细步骤啦,没看懂的小伙伴最后附上全部代码

<template>
    <div class="test">
        <a-form-item label="营运单位" style="width: 16vw; margin: 15px">
          <a-select
            mode="multiple"
            :max-tag-count="1"
            allowClear
            v-model:value="valueGlc"
            @change="changeUnit"
            :options="optionsGlc"
          >
            <template #maxTagPlaceholder="omittedValues">
              <span class="allSelsct" v-if="optionsGlc.length === omittedValues.length + 1">全选</span>
              <span v-else>+ {{ omittedValues.length }} ...</span>
            </template>
            <!-- 全选---这里就是实现一键全选和清空的细节操作 -->
            <template #dropdownRender="{ menuNode: menu }">
              <v-nodes :vnodes="menu" />
              <a-divider style="margin: 4px 0" />
              <div style="padding: 4px 8px; margin-left: 50px; cursor: pointer" @mousedown="e => e.preventDefault()">
                <a-button type="link" @click="selectAll">全选</a-button>
                <a-button type="link" @click="clearAll">清空</a-button>
              </div>
            </template>
          </a-select>
        </a-form-item>
    </div>
</template>

<script setup>
import { selectorRoadDeptLists } from '@/api/tjfx.js'
//所选择的营运单位
const valueGlc=ref('')
//营运单位选项列表
const optionsGlc=ref([])
//下拉菜单组件不可少,不然后续不显示菜单
const VNodes = (_, { attrs }) => {
  return attrs.vnodes
}
//选择营运单位事件
const changeUnit=()=>{}
// 一键全选
const selectAll=()=>{
    valueGlc.value = optionsGlc.value.map(option => option.value)
}
// 一键清空
const clearAll=()=>{
    valueGlc.value = []
}
// 获取下拉框数据-营运单位
const getOptionsGlc = () => {
  return new Promise((resolve, reject) => {
    selectorRoadDeptLists()
      .then(res => {
        if (res.code === 200 && res.data) {
          res.data.forEach((item, index) => {
            optionsGlc.value.push({
              value: item.code,
              code: item.code,
              label: item.name
            })
            valueGlc.value.push(item.code)
          })
        }
      })
  })
}
onMounted(() => {
    getOptionsGlc()
})
</script>

<style lang='less' scoped>
.test{}
</style>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值