ant design vue:带日期标记的日历

文章展示了如何在Vue项目中使用ant-design-vue的日历组件,进行头部的自定义渲染,包括只显示月份的选择,以及如何进行汉化处理。同时,提到了在模板中使用moment.js的方法和日历中添加特殊日期标记的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完整代码:

<template>
    <div :style="{ width: '300px', border: '1px solid #d9d9d9', borderRadius: '4px' }">
     <!-- 日历汉化 -->
     <a-config-provider :locale="locale">
        <a-calendar :header-render="headerRender" @select="onSelect" :fullscreen="false">
            <div slot="dateCellRender" slot-scope="value">
                <template v-for="(item,index) in restDay">
                    <span :key="index" class="restCls" v-if="moment(value).format('YYYY-MM-DD') == item">
                    </span>
                </template>
            </div>
        </a-calendar>
    </a-config-provider>
    </div>
</template>
<script>
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
import moment from 'moment';

export default {
    data() {
        return {
          moment,//moment必须在data里定义后才能在template里直接使用
          locale: zhCN,
          selectedValue: '',
          restDay: ['2023-02-03','2023-02-04','2023-02-05'],
        };
      },
  methods: {
      headerRender({ value, type, onChange, onTypeChange }) {
            const start = 0;
            const end = 12;
            const monthOptions = [];
      
            const current = value.clone();
            const localeData = value.localeData();
            const months = [];
            for (let i = 0; i < 12; i++) {
              current.month(i);
              months.push(localeData.monthsShort(current));
            }
      
            for (let index = start; index < end; index++) {
              monthOptions.push(
                <a-select-option class="month-item" key={`${index}`}>
                  {months[index]}
                </a-select-option>,
              );
            }
            const month = value.month();
      
            const year = value.year();
            const options = [];
            for (let i = year - 10; i < year + 10; i += 1) {
              options.push(
                <a-select-option key={i} value={i} class="year-item">
                  {i}
                </a-select-option>,
              );
            }
            return (
              <div style={{ padding: '10px' }}>
                <a-row type="flex" justify="space-between">
                  <a-col>
                    <a-select
                      size="small"
                      dropdownMatchSelectWidth={false}
                      class="my-year-select"
                      onChange={newYear => {
                        const now = value.clone().year(newYear);
                        onChange(now);
                      }}
                      value={String(year)}
                    >
                      {options}
                    </a-select>
                  </a-col>
                  <a-col>
                    <a-select
                      size="small"
                      dropdownMatchSelectWidth={false}
                      value={String(month)}
                      onChange={selectedMonth => {
                        const newValue = value.clone();
                        newValue.month(parseInt(selectedMonth, 10));
                        onChange(newValue);
                      }}
                    >
                      {monthOptions}
                    </a-select>
                  </a-col>
                </a-row>
              </div>
            );
          },
      onSelect(value) {
            this.value = value;
            this.selectedValue = value;
            console.log("select:"+moment(this.selectedValue).format('YYYY-MM-DD'))
          },
  },
};
</script>
<style scoped>
    .restCls {
      position: relative;
      top: -10px;
      width: 28px;
      height: 28px;
      border-radius: 50%;
      display: inline-block;
      left: 0px;
      border: 2px solid #1890ff;
    }
    /deep/ .ant-fullcalendar-value{
        width: 28px;
        height: 28px;
         border-radius: 50%;
    }

</style>

最终效果:

难点:

  1. 自定义头部:参考官网即可,我的日历头部右边只需要显示月,不需要年,把年的部分去掉即可。

  1. 在template里直接用moment,先import然后还需要在data里再定义一下moment。

  1. 日历默认是英文的,需要汉化,参考官网,如果是做项目的话,直接在App.vue文件里设置,整个项目的antd组件就都被汉化了。

参考博客:

https://blog.youkuaiyun.com/yehaocheng520/article/details/123730865

### Ant Design Vue 日历组件代码示例与解释 #### HTML 结构 HTML部分主要通过`<a-calendar>`标签来引入日历组件。此标签允许开发者轻松嵌入一个功能齐全的日历Vue应用中。 ```html <a-calendar @panelChange="onPanelChange" /> ``` 上述代码展示了最基础的日历组件调用方式[^3]。 #### JavaScript 方法定义 为了增强用户体验以及满足特定业务逻辑需求,通常会为日历组件绑定一些事件处理函数。下面是一个简单的例子: ```javascript methods: { onPanelChange(value, mode) { console.log(value.format('YYYY-MM-DD'), mode); } } ``` 这里定义了一个名为`onPanelChange`的方法用于监听面板变化并打印当前选中的日期和模式(年视图/月视图),这有助于开发人员了解用户的交互行为。 #### 自定义样式与配置项设置 除了基本的功能外,还可以进一步定制化该组件以适应不同的应用场景。比如修改默认显示的语言、调整布局结构或是更改主题颜色等。对于想要改变某些细节外观的情况,则可以通过CSS覆盖原有类名的方式来达成目的;而对于更深层次的属性控制,则可以利用官方提供的API接口完成相应操作。 ```css /* 修改字体大小 */ .ant-fullcalendar-value { font-size: 18px !important; } /* 设置周末背景色 */ .ant-fullcalendar-date-content .ant-fullcalendar-day-header-weekend, .ant-fullcalendar-month-panel-tbody td:nth-child(7n), .ant-fullcalendar-month-panel-tbody td:nth-last-child(-n+2){ background-color:#f5f5f5; } ``` 以上CSS片段实现了对日历内文字尺寸及周末单元格样式的个性化设定[^2]。 #### 数据格式转换技巧 当涉及到具体的时间戳或字符串形式的数据交换时,可能需要用到Moment.js库来进行格式之间的互相转化。例如,在获取用户输入的具体某一天之后,将其转化为标准格式保存至数据库中去。 ```javascript import moment from 'moment'; // 将时刻对象转成指定格式字符串 let formattedDate = moment(selectedDate).format('YYYY-MM-DD'); console.log(formattedDate); // 输出类似于 "2024-01-09" ``` 这段脚本说明了怎样借助第三方工具快速有效地解决不同系统间存在的兼容性差异问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值