Ant design Vue 中的 a-select 组件自定义下拉框

Ant-design-vue使用select下拉选的时候想对下拉框的内容扩展,官网文档提示使用 dropdownRender 对下拉菜单进行自由扩展。

之前一直在使用ElmentPlus 对于ant的组件不是很熟悉,就做了一些尝试,如下是做了一个简单的表单。

基本上完成自己想要的效果

具体实现过程:

1 创建vue3项目
npm create vue@latest
2 引入ant-design-vue
npm i --save ant-design-vue@next

   main.js中引入

import { createApp } from 'vue';
import Antd from 'ant-design-vue';
import App from './App';
import 'ant-design-vue/dist/antd.css';

const app = createApp();
app.config.productionTip = false;

app.use(Antd);
3.创建Test.vue
<template>
    <div class="p-10 " style="width: 800px;margin: 0 auto;">
     <a-typography-title  :level="4" >自定义a-select组件</a-typography-title>
    </div>
</template>

<script setup>
import { ref, reactive, defineComponent, h } from 'vue'

</script>

<style lang="less" scoped>

</style>

使用ant的表单组件,具体select的具体使用:

<a-form layout="vertical"  
        :form-state="formState">
        <a-form-item label="标题">
            <a-input v-model:value="formState.title" placeholder="请输入标题" showCount :maxlength="100"  />
        </a-form-item>
    <a-form-item label="标签">
        <a-select
            v-model:value="formState.tags"
            show-search
            mode="multiple"
            style="width: 100%"
            placeholder="可选10个标签,支持搜索"
            :options="options"
            :forceRender="true"
            :dropdownMatchSelectWidth="false"
            >
            <template #menuItemSelectedIcon></template>
                <template #dropdownRender="{ menuNode: menu }">
                <div class="custom-dropdown">
                    <a-tabs v-model:activeKey="activeKey" @change="handleTabChange">
                    <a-tab-pane tab="推荐" key="1">
                        <a-checkable-tag><VNodes :vnodes="menu" />
                </a-checkable-tag>
                    </a-tab-pane>
                    <a-tab-pane tab="热门" key="2">
                         <a-checkable-tag><VNodes :vnodes="menu" /></a-checkable-tag>
                    </a-tab-pane>
                    <a-tab-pane tab="活动" key="3">
                          <a-checkable-tag><VNodes :vnodes="menu" /></a-checkable-tag>
                    </a-tab-pane>
                    </a-tabs>
                </div>
                </template>
                                                    
            </a-select>
    </a-form-item>  
     <a-form-item label="内容描述" name="desc">
      <a-textarea v-model:value="formState.desc" />
    </a-form-item>
      <a-form-item >
      <a-button type="primary" @click="onSubmit">提交</a-button>
    </a-form-item>

    </a-form> 

 js部分的数据:

<script setup>
import { ref, reactive, defineComponent, h } from 'vue'

// 更安全的 VNodes 组件
const VNodes = (_, { attrs }) => {return attrs.vnodes;}

const formState = reactive({ 
    title:'',
    tags: [] ,
    desc:''
})

const queAnswerTagList = [
  {
    name: "推荐",
    tagList: ["Bug", "求职", "项目", "学习", "技术"]
  },
  {
    name: "热门",
    tagList: ["AI", "区块链", "物联网", "大数据"]
  },
  {
    name: "活动",
    tagList: ["活动1", "活动2", "活动3", "活动4"]
  }
]

const options = ref(
  queAnswerTagList[0].tagList.map(item => 
    ({ value: item, label: item })
  )
)

const activeKey = ref('1')

const handleTabChange = (key) => {
  const index = parseInt(key) - 1
  options.value = [...queAnswerTagList[index].tagList]
    .map(item => ({ value: item, label: item }))
}
</script>

修改一些下拉选中的样式css:

// 下拉容器样式
:deep(.custom-large-dropdown) {
  .ant-select-dropdown-menu {
    max-height: none !important; // 禁用默认最大高度
  }
}
.custom-dropdown {
  max-height: 300px;
  overflow: hidden;

  :deep(.ant-tabs-content) {
    padding: 8px 0;
  }
  
  :deep(.ant-tabs-nav) {
    margin: 0 12px;
  }
  :deep(.ant-select-item-option){
     white-space: nowrap; /* 防止文本换行 */
    overflow: hidden; /* 隐藏溢出的内容 */
    text-overflow: ellipsis; /* 使用省略号表示被截断的文本 */
    //   line-height: 32px; /* 设置行高,确保单行显示 */
  } 
  :deep(.ant-tag-checkable:not(.ant-tag-checkable-checked):hover) {
  
    background-color: #fff;
  }
  :deep(.rc-virtual-list-holder-inner) {
    display: flex; 
    flex-direction: row !important;
    gap: 8px;

  }
  :deep(.ant-select-item-option-selected:not(.ant-select-item-option-disabled) ){
    /* color: rgba(0, 0, 0, 0.88); */
     font-weight: 500; 
    // font-size: 12px;
    color:#fff;
    background-color: #1890ff;
}
}

ant-design-vue 中,下拉框多选的自定义选项可以通过 `template` 和 `render` 方法来实现。 使用 `template` 的方式,可以在 `<a-select-option>` 标签内编写自定义的选项内容。例如: ```html <a-select v-model="selectedOptions" mode="multiple"> <a-select-option v-for="option in options" :key="option.value"> <span>{{ option.label }}</span> <a-checkbox v-model="option.checked"></a-checkbox> </a-select-option> </a-select> ``` 在上面的代码中,`options` 是一个数组,用于存储所有的选项。每个选项包含 `label` 和 `value` 属性,以及一个 `checked` 属性用于记录是否选中。通过循环遍历 `options` 数组,使用 `<a-select-option>` 标签来创建每个选项,并在其中放置自定义的内容。 使用 `render` 方法的方式更加灵活,可以直接通过 JavaScript 代码来生成自定义选项。例如: ```html <a-select v-model="selectedOptions" mode="multiple"> <template v-for="option in options"> <a-select-option :value="option.value" :key="option.value"> {{ option.label }} <a-checkbox v-model="option.checked"></a-checkbox> </a-select-option> </template> </a-select> ``` 在上面的代码中,通过 `<template>` 标签来生成多个 `<a-select-option>` 标签,然后在其中使用 JavaScript 代码来设置 `value` 和 `key` 属性,并添加自定义内容。 需要注意的是,无论使用 `template` 还是 `render` 方法,都需要使用 `v-model` 来绑定选中的选项,以及在选项中设置 `value` 属性和 `key` 属性。另外,还可以根据具体需求在选项中添加其他自定义组件或标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值