vue antd 实现年度选择和年度范围选择

该文章介绍了一个使用Vue和AntDesignVue库实现的组件,该组件可以根据用户需求在年份选择和年度范围之间动态切换。组件内部利用动态组件`<component:is>`和Vue的ref进行状态管理,提供切换显示、值输入及清除功能。
摘要由CSDN通过智能技术生成

工作中遇到一个需求效果如下:

当我们点击选择年度的时候,选择器面板切换为年度范围的效果,同理,当我们点击选择年份的时候,选择器面板切换为年份选择的效果
在这里插入图片描述

在这里插入图片描述

  • 实现方式就是要借助vue的动态组件封装

子组件

<template>
    <Component :is="comp[currentComp]" v-bind="config" :open="isOpen" format="YYYY" v-on="listeners">
          <template slot="renderExtraFooter">
               <a-button type="link" @click="toggleShowYear">{{ showYear ? '选择年度' : '选择年份' }}</a-button>
              </template>
         </Component>
</template>
    
<script setup>
import { ref } from 'vue';
import { DatePicker } from 'ant-design-vue';
import moment from 'moment';

const showYear = ref(true);
const isOpen = ref(false);

const props = defineProps(['value']);
const emit = defineEmits(['input']);

const comp = {
    date: DatePicker,
    range: DatePicker.RangePicker,
};

const config = ref({
    mode: 'year',
    placeholder: '填报年度',
    value: props.value,
});

const currentComp = ref('date');

const handleOpenYear = (open) => {
    isOpen.value = open;
};

const handleChangeYear = (value) => {
    if (Array.isArray(value)) {
        emit('input', [moment(value[0]).format('YYYY'), moment(value[1]).format('YYYY')]);
    } else {
        emit('input', moment(value).format('YYYY'));
    }

    config.value.value = value;
    isOpen.value = false;
};

const clearYear = () => {
    config.value.value = null;
    emit('input', null);
};

const toggleShowYear = () => {
    showYear.value = !showYear.value;
    if (showYear.value) {
        currentComp.value = 'date';
        config.value = {
            mode: 'year',
            placeholder: '请选择年份',
            value: null,
        };
    } else {
        currentComp.value = 'range';
        config.value = {
            mode: ['year', 'year'],
            placeholder: ['开始', '结束'],
            value: [],
        };
    }
};

const listeners = ref({
    openChange: handleOpenYear,
    panelChange: handleChangeYear,
    change: clearYear,
});
</script>

父组件

<YearSwitch v-model="formInline.yearVal" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值