VUE自定义日历组件,计算年月日,上个月份的空白展示,点击某一天进入详情页面

效果图:

效果图

背景描述:

产品提出需求,需要日历来配置每一天的商品价格。刚开始使用的element-ui的el-calendar组件,由于样式、跳转、点击事件等功能都不好控制,所以自己写了一个日历组件。完美符合需求交差。

代码展示:

		<div class="dataContent">
          <div class="dataMonthContent clearfix">
            // 顶部月份切换左箭头
            <div>
              <span class="prev" @click="clickLeft"></span>
            </div>
            // 月份
            <div class="monthList clearfix">
              <ul>
                <li>
                  <span>{{ selectedYear }}年{{ selectedMonth + 1}}月</span>
                </li>
              </ul>
            </div>
            // 顶部月份切换右箭头
            <div>
            	<span class="next" @click="clickRight"></span>
            </div>
          </div>
          // 星期
          <div class="dataTypeContent clearfix">
            <ul>
              <li v-for="(item, index) in blockHead" :key="index">
                {{ item }}
              </li>
            </ul>
          </div>
          // 日期
          <div class="dataListContent clearfix">
            <ul class="clearfix">
              <li
                v-for="(item, index) in newDate"
                :key="index"
                @click="toDetail(item)"
                class="dataListContent_list_item"
              >
                <div class="list_item_date">
                  {{ item.content }}
                </div>
                <div class="list_item_msg">
                  <p>
                    // 这里可以填写某一天日期需要展示的其他字段
                  </p>
                </div>
              </li>
            </ul>
          </div>
        </div>
data:{
	return: {
		year: new Date().getFullYear(),
      	month: new Date().getMonth() + 1,
      	day: new Date().getDate(),
      	selectedYear: new Date().getFullYear(),
      	selectedMonth: new Date().getMonth(),
      	selectedDate: new Date().getDate(),
      	blockHead: ["日", "一", "二", "三", "四", "五", "六"],
      	newDate: [],
	}
},
mounted() {
    this.initDate(this.year, this.month, this.day);
},
methods: {
	// 点击切换上个月的日历
    clickLeft() {
      if (this.selectedMonth === 0) {
        this.selectedYear = this.selectedYear - 1;
        this.selectedMonth = 11;
        this.selectedDate = 1;
      } else {
        this.selectedMonth = this.selectedMonth - 1;
        this.selectedDate = 1;
      }
      this.initDate(
        this.selectedYear,
        this.selectedMonth + 1,
        this.selectedDate
      );
    },
    // 点击切换下个月的日历
    clickRight() {
      if (this.selectedMonth === 11) {
        this.selectedYear = this.selectedYear + 1;
        this.selectedMonth = 0;
        this.month = 0;
        this.selectedDate = 1;
      } else {
        this.selectedMonth = this.selectedMonth + 1;
        this.month = this.selectedMonth + 1;
        this.selectedDate = 1;
      }
      this.initDate(
        this.selectedYear,
        this.selectedMonth + 1,
        this.selectedDate
      );
    },
    // 获取日历的日期渲染
    initDate(year, month, day) {
      // 定义每个月的天数,如果是闰年第二月改为29天
      // 每个月对应的天数
      let daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
      if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
        // 闰年+1天
        daysInMonth[1] = 29;
      }

      // 获得第一天是星期几
      let targetDay = new Date(year + "-" + month + "-01").getDay();
      let perNum = targetDay;
      let info = []; // 存放日历数据列表
      // 填充前方空位
      if (targetDay > 0) {
        for (let i = 0; i < perNum; i++) {
          let obj = {
            type: "pre",
            content: "",
            month: month - 1
          };
          info.push(obj);
        }
      }

      // 填充日期正文数字
      for (let i = 0; i < daysInMonth[month - 1]; i++) {
        let obj = {
          type: "normal",
          content: i + 1,
          month: month
        };
        info.push(obj);
      }
      let nextNum = 0;
      if (info.length > 35) {
        // 1行7位,超过5行了
        nextNum = 42 - info.length;
      } else {
        nextNum = 35 - info.length;
      }
      for (let i = 0; i < nextNum; i++) {
        let obj = {
          type: "next",
          content: i + 1,
          month: month + 1
        };
        info.push(obj);
      }
      this.newDate = info; // 得到新的日历数据
    },
    // 跳转到详情页面,携带需要的数据
    toDetail(val) {
    	this.$router.push(...)
    }
}

样式我在这里就不详细写了,大家各取所需。

祝大家中秋节快乐!下班下班 :) ❀
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
我很抱歉,但是我无法直接通过引用内容查看具体的图片和代码。然而,根据你提供的引用信息,我可以告诉你关于vue日历定义组件的一些信息。 根据引用,这个组件目录可以提供给你一些关于vue日历定义组件的相关代码和文件。 根据引用,这个vue日历组件支持农历和假期展示,并且可以自定义可选择的期范围。 根据引用,在组件中使用这个vue日历组件,你需要在main.js中引入它。组件默认情况下会显示一个自定义的左侧icon。某一个期可以出现选中状态,也可以使用圆点模式来表示选中状态。你可以通过传递一个包含active属性的数组对象来自定义某一天的数据。 总的来说,这个vue日历定义组件提供了一些可定制化的功能,包括农历展示、假期展示以及可选择期范围等。你可以根据你的需求在组件中进行相应的配置和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue定义日历组件](https://blog.csdn.net/weixin_38644883/article/details/88067612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [vue日历组件,支持农历以及假期展示,可以自定义可选择期范围](https://download.csdn.net/download/qq_29597215/86267518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值