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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值