ant-design-vue 自定义日期下拉框

项目场景:

使用ant-design-vue实现一个自定义日期选择的下拉框,下拉框选项中包含近一周、近一个月、最近一年和自定义日期(如下图)。
在这里插入图片描述


问题描述

这里使用 a-select 组件的 dropdownRender 对下拉菜单进行扩展。当鼠标移入到自定义选项时,展示组件 a-range-picker ,当聚焦在 a-range-picker 时,下方的日期选择出现在左上方!(由图一到图二)

图一

在这里插入图片描述


原因分析:

提示:这里填写问题的分析:

a-range-picker 组件定义浮层的容器默认为body
在这里插入图片描述


解决方案:

修改 a-range-picker 浮层的容器为父元素

关键代码

<a-range-picker 
	v-show="rangPickerOpen" 
	change="rangPickerChange"
	openChange="openORclosePanel"
 	:getCalendarContainer="(trigger) => {
 		return trigger.parentNode || document.body;
		 }"
 /> ```

组件代码

<template>
  <div class="dateSelect">
    <a-select
      ref="selectRef"
      default-value="month"
      :open="open"
      @focus="selectFocus"
      @blur="selectBlur"
      @select="selected"
      v-model="val"
    >
      <div slot="dropdownRender" slot-scope="menu">
        <v-nodes :vnodes="menu" />
        <a-divider style="margin: 4px 0" />
        <div
          style="padding: 4px 16px; cursor: pointer; position: relative"
          @mousedown="(e) => e.preventDefault()"
          @mouseenter="rangPickerOpen = true"
          @mouseleave="rangPickerOpen = false"
        >
          <span>自定义</span>
          <div
            style="
              width: 300px;
              position: absolute;
              left: 100%;
              top: -5px;
              margin-left: 1px;
            "
          >
            <a-range-picker
              v-show="rangPickerOpen"
              @change="rangPickerChange"
              @openChange="openORclosePanel"
              
            />
          </div>
        </div>
      </div>
      <a-select-option value="week"> 近一周 </a-select-option>
      <a-select-option value="month"> 近一个月 </a-select-option>
      <a-select-option value="year"> 最近一年 </a-select-option>
      <a-select-option :key="i" v-for="(item,i) in customTime" :value="item.value"> {{item.title}} </a-select-option>
    </a-select>
  </div>
</template>

<script lang="ts">
import { Component, Ref, Vue, Emit, Watch } from "vue-property-decorator";
import moment from "moment";
import { Switch } from "ant-design-vue";

@Component({
  components: {
    VNodes: {
      functional: true,
      render: (h: any, ctx: any) => ctx.props.vnodes,
    },
  },
})
export default class DateSelect extends Vue {
  @Ref() readonly selectRef!:any
  rangPickerOpen: boolean = false;
  open: boolean = false;
  val:string = 'month'
  dateString:any[] = []
  customTime:any[] = []

  selectFocus() {
    this.open = true;
  }
  selectBlur() {
    if(this.rangPickerOpen) return
    this.open = false
  }
  selected() {
    this.selectRef.blur()
  }

  @Watch('val')
  onValChange() {
    if(this.val === 'custom') {
      this.$emit('selectChange', {
        startTime: this.dateString[0],
        endTime: this.dateString[1]
      })
    } else {
      const range = this.getTime(this.val)
      this.$emit('selectChange', range)
    }
  }

  getTime(range:any) {
    console.log(range);
    let startTime = ''
    let endTime = ''
    switch(range) {
      case 'week':
        startTime = moment().subtract(1, 'weeks').format('YYYY-MM-DD')
        endTime = moment().format('YYYY-MM-DD')
        break;
      case 'month':
        startTime = moment().subtract(1, 'months').format('YYYY-MM-DD')
        endTime = moment().format('YYYY-MM-DD')
        break;
      case 'year':
        startTime = moment().subtract(1, 'years').format('YYYY-MM-DD')
        endTime = moment().format('YYYY-MM-DD')
        break;
      default :
        startTime = ''
        endTime = ''
    }
    return {
      startTime,
      endTime
    }
  }
  
  // 日期选择改变后,select下新增一条自定义范围的时间选项
  rangPickerChange(date: any[], dateString: string[]) {
    this.dateString = dateString
    this.customTime = [{
      title: moment(date[0]).format('YYYY.M.D') + ' 至 ' + moment(date[1]).format('YYYY.M.D'),
      value: 'custom'
    }]
    this.val = this.customTime[0].value
  }
  // 弹出或关闭面板的回调
  openORclosePanel(status:boolean) {
    this.open = status
  }

}
</script>

<style scoped lang="less">
.dateSelect {
  margin-bottom: 16px;
  .ant-select {
    width: 240px;
  }
}
</style>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ant-design-vue下拉框支持多选,只需要在Select组件中设置mode属性为'multiple'即可。同时,需要在Option组件中设置value属性,以便在多选时能够正确地获取选中的值。例如: ``` <template> <a-select mode="multiple" v-model="selectedValues"> <a-select-option v-for="option in options" :key="option.value" :value="option.value"> {{ option.label }} </a-select-option> </a-select> </template> <script> export default { data() { return { options: [ { label: '选项1', value: 'option1' }, { label: '选项2', value: 'option2' }, { label: '选项3', value: 'option3' }, ], selectedValues: [], }; }, }; </script> ``` 在上面的例子中,我们定义了一个Select组件,设置了mode属性为'multiple',并使用v-model指令绑定了一个数组selectedValues,用于存储选中的值。在Option组件中,我们设置了value属性为每个选项的value值,以便在多选时能够正确地获取选中的值。 ### 回答2: Ant Design Vue是一个非常流行的Vue UI组件库,其中包含了多种实用的UI组件,包括常用的下拉框(Select)组件。而在Ant Design Vue下拉框组件中,我们还可以选择多个选项,这就是下拉框多选功能。 使用Ant Design Vue下拉框多选组件非常简单,只需要按照一下几个步骤即可: 1.导入组件 首先,我们需要在Vue组件中导入Ant Design Vue下拉框多选组件,代码如下: ``` import { Select } from 'ant-design-vue'; export default { components: { Select, }, } ``` 2.使用组件 接下来,在Vue组件中使用Ant Design Vue下拉框多选组件,代码如下: ``` <template> <div> <a-select mode="multiple" :options="options" v-model="selectedOptions"> </a-select> </div> </template> <script> export default { data() { return { options: [ { label: '选项1', value: '1' }, { label: '选项2', value: '2' }, { label: '选项3', value: '3' }, ], selectedOptions: [], }; }, } </script> ``` 其中,我们使用了Ant Design Vue的Select组件,并且设置了mode属性为multiple,表示启用多选模式。然后,我们使用options属性设置下拉框中的选项列表,使用v-model属性绑定所选的选项列表。 3.获取选项列表 最后,我们可以通过selectedOptions属性获取选项列表,并进行相应的操作,例如将选项列表提交给后台进行保存等等。 总之,使用Ant Design Vue下拉框多选组件非常方便,只需要简单的几步即可实现多选功能。而且,Ant Design Vue还提供了丰富的样式和API,可以很方便的自定义样式和扩展功能。因此,Ant Design Vue下拉框多选组件是Vue开发中一个非常实用的UI组件。 ### 回答3: Ant Design Vue 是一种基于 Ant Design 的 UI 库,适用于 Vue 开发人员。Ant Design Vue 提供了一个下拉框组件供开发人员使用,包括单选和多选两种类型。下面将详细介绍 Ant Design Vue 中的下拉框多选。 首先,我们可以通过使用 Ant Design Vue 的 Dropdown 组件来实现一个下拉框,然后通过指定 mode 属性为 multiple,即可将单选下拉框转换为多选下拉框。下面是一个基本多选下拉框的示例代码: ``` <template> <a-dropdown :overlay="menu" v-model="selectedTags" mode="multiple"> <a class="ant-dropdown-link" href="#">{{selectedTags.length}} tags selected<down-outlined /></a> </a-dropdown> </template> <script> export default { data() { return { selectedTags: [], tags: [ { label: 'Tag1', value: 'tag1' }, { label: 'Tag2', value: 'tag2' }, { label: 'Tag3', value: 'tag3' }, { label: 'Tag4', value: 'tag4' }, { label: 'Tag5', value: 'tag5' } ] }; }, computed: { menu() { return ( <a-menu slot="overlay"> <a-menu-item-group> <a-menu-item v-for="tag in tags" :key="tag.value"> <a-checkbox :value="tag.value" v-model="selectedTags"> {{tag.label}} </a-checkbox> </a-menu-item> </a-menu-item-group> </a-menu> ); } } }; </script> ``` 在上面的代码中,我们定义了一个名为 selectedTags 的数组作为多选下拉框的选项。然后,我们定义了一个名为 tags 的数组作为可供选择的选项。我们使用 Dropdown 组件来包装多选下拉框,并指定 mode 属性为 multiple。然后,我们使用 menu 属性来定义下拉菜单的内容,其中使用 a-checkbox 组件包装了所有可选项。 这样,多选下拉框就实现了。通过选中或取消选中不同的选项,我们可以在 selectedTags 数组中获取所有选中的选项的值。由于 ant-design-vue 组件库使用了 Vue 的响应式系统,所以 selectedTags 数组的值的变化都会自动更新到界面上。 总结一下,Ant Design Vue 提供了丰富的组件库,其中包括了强大的下拉框组件。通过简单的使用 Dropdown 组件和 a-checkbox 组件,我们可以很容易地实现一个多选下拉框。在实际开发中,我们可以根据需要对多选下拉框进行适当的定制,满足不同的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘寰ya

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值