自定义日期组件,左右按钮控制向前或向后翻年、翻月、翻周、翻日

vue日期左右可切换组件 基于vue可以左右切换日期组件 阅读详情

遇到这样一个需求,为了方便用户操作,使用左右按钮进行查看上一年或者下一年数据、上一月或者下一月数据、上一周或者下一周数据、前一天,或者后一天数据。
在这里插入图片描述
如上图所示,点击左右按钮,时间往前或往后变更,按钮也会出现禁用状态。
具体实现代码如下:

<template>
  <div class="c-date">
    <button type="text"
            class="btn-prev"
            :disabled="disabledPrevCurrent"
            @click.stop="leftClick"
    >
      <i class="el-icon " :class="[iconType=='yearIcon'? 'el-icon-d-arrow-left': 'el-icon-arrow-left', disabledPrevCurrent == false ? 'fontColor': '']"></i>
    </button>
    <span v-if="isWeek">
      <span>{{ getWeek[0] }}</span> <span style="margin:0 10px;">至</span> <span>{{ getWeek[1] }}</span>
    </span>
    <span class="dateFont" v-else>{{ getDate }}<slot></slot></span>
    <button type="text"
            class="btn-next"
            :disabled="disabledNextCurrent"
            @click.stop="rightClick"
    >
      <i class="el-icon" :class="[iconType=='yearIcon'? 'el-icon-d-arrow-right': 'el-icon-arrow-right',disabledNextCurrent == false ? 'fontColor': '']"></i>
    </button>

  </div>
</template>

<script>

  import moment from 'moment'
  export default {
    name: 'myDate',
    props:{
      isWeek:{ // 是否是周范围
        type:Boolean,
        required: false,
        default: false
      },
      week:{ // 周范围时间
        type:Array,
        required:false,
        default:function(){
          const startDate = moment().week(moment().week()).startOf('week').format('YYYY-MM-DD');   //这样是年月日的格式
          const endDate = moment().week(moment().week()).endOf('week').format('YYYY-MM-DD'); //这样是时间戳的格式
          return [startDate,endDate]
        }
      },
      date:{ // 日期
        type: [String,Object,Date],
        required: false,
        default: function(){
          return new Date()
        }
      },
      disabledPrev:{ // 左边按钮是否禁用
        type:Boolean,
        required: false,
        default: false
      },
      disabledNext:{ // 右边按钮是否禁用
        type:Boolean,
        required: false,
        default: false
      },
      type:{ // 日期格式类型, eg: 2020年5月        2020-05-11
        type: String,
        required: false,
        default: "YYYY-MM-DD"  // YYYY-MM-DD eg:2020年-5-30      words eg: 2020年5月        year eg: 2020年
      },
      iconType:{ // 图标类型
        type: String,
        required: false,
        default: "icon"  // icon------<>   yearIcon ----------《》
      }
    },
    data(){
      return{
        getDate: this.type==='YYYY-MM-DD'? moment(this.date).format("YYYY-MM-DD"):this.type==='year'?  moment(this.date).format("YYYY年"): moment(this.date).format("YYYY年M月") ,
        disabledPrevCurrent: this.disabledPrev,
        disabledNextCurrent: this.disabledNext,
        getWeek: this.week
      }
    },
    watch:{
      week: {
        handler (n) {
          if (n) {
           console.log(n,'fffffffffff')
            this.getWeek = n
          }
        },
        deep: true,
        immediate: true
      },
      date: {
        handler (n) {
          if (n) {
            this.getDate =this.type==='YYYY-MM-DD'? moment(n).format("YYYY-MM-DD"):this.type==='year'?  moment(n).format("YYYY年"): moment(n).format("YYYY年M月")
          }
        },
        deep: true,
        immediate: true
      },
      disabledPrev: {
        handler (n) {
          console.log(n)
          this.disabledPrevCurrent = n
        },
        deep: true,
        immediate: true
      },
      disabledNext: {
        handler (n) {
          this.disabledNextCurrent = n
        },
        deep: true,
        immediate: true
      }
    },
    methods:{
      /** 年 月  日期转换方法 */
      dateChange(val){
        const str = val.substr(0,val.length-1)
        const year = str.substr(0,4)
        let nowDate = ''
        if(str.length>4){
          var month = str.substr(5,str.length-1)
          if(month.length<2){
            month = '0'+month
          }
          nowDate = year + '-' + month
          // console.log(nowDate,'g333ggg')
          return nowDate
        }else{
          nowDate = year
          return nowDate
        }
      },
      /** 日期向前翻 */
      leftClick(){
        if(this.isWeek){
          let arr = [],sendArr=[]
          const start = moment(moment(this.getWeek[0]).subtract(7, 'd')).format('YYYY-MM-DD')
          const end =  moment(moment(this.getWeek[1]).subtract(7, 'd')).format('YYYY-MM-DD')
          arr.push(start)
          arr.push(end)
          this.getWeek = [...arr]
          const sendStart = moment(start).format()
          const sendEnd = moment(end).format()
          sendArr.push(sendStart)
          sendArr.push(sendEnd)
          this.$emit("leftClick", sendArr)
        }
        if(this.type==='YYYY-MM-DD'){
          this.getDate = moment(this.getDate).subtract(1, 'days').format('YYYY-MM-DD') // 获取前一天
          this.$emit("leftClick", moment(this.getDate).format())
        }else if(this.type==='year'){
          const date = this.dateChange(this.getDate)
          this.getDate = moment(date).subtract(1, 'year').format("YYYY年") // 获取后一天
          this.$emit("leftClick", moment(this.dateChange(this.getDate)).format())
        } else{
          const date = this.dateChange(this.getDate)
          this.getDate = moment(date).subtract(1, 'months').format("YYYY年M月") // 获取后一天
          this.$emit("leftClick", moment(this.dateChange(this.getDate)).format())
        }
      },
      /** 日期向后翻 */
      rightClick(){
        if(this.isWeek){
          let arr = [],sendArr=[]
          const start = moment(moment(this.getWeek[0]).add(7, 'd')).format('YYYY-MM-DD')
          const end =  moment(moment(this.getWeek[1]).add(7, 'd')).format('YYYY-MM-DD')
          arr.push(start)
          arr.push(end)
          this.getWeek = [...arr]
          const sendStart = moment(start).format()
          const sendEnd = moment(end).format()
          sendArr.push(sendStart)
          sendArr.push(sendEnd)
          this.$emit("rightClick", sendArr)
        }
        if(this.type==='YYYY-MM-DD') {
          this.getDate = moment(this.getDate).add(1, 'days').format('YYYY-MM-DD') // 获取后一月
          this.$emit("rightClick", moment(this.getDate).format())
        }else if(this.type==='year'){
          const date = this.dateChange(this.getDate)
          this.getDate = moment(date).add(1, 'year').format("YYYY年") // 获取后一天
          this.$emit("rightClick", moment(this.dateChange(this.getDate)).format())
        }else{
          const date = this.dateChange(this.getDate)
          this.getDate = moment(date).add(1, 'months').format("YYYY年M月") // 获取后一月
          this.$emit("rightClick", moment(this.dateChange(this.getDate)).format())
        }
      }
    }
  }
</script>

<style lang="scss" scoped>
.c-date{
  button{
    border: none;
    padding: 0 6px;
    cursor: pointer;
    background: transparent;
    &:hover {
      color: #4096FF;
    }
    &:disabled{
      color: #C0C4CC;
      background-color: #fff;
      cursor: not-allowed;
    }
  }
  .btn-prev,.btn-next{
    background-color: #fff;
    margin: 0;
    color: #303133;
    outline: none;
  }
  .btn-prev{
    padding-right: 12px;
  }
  .btn-next{
    padding-left:12px;
  }

  .ai-icon{
    font-size:18px;
    &:hover{
      //color:blue;
    }
  }
  .fontColor{
    color: #4096FF;
  }
  .dateFont{
    moz-user-select: -moz-none;
    -moz-user-select: none;
    -o-user-select:none;
    -khtml-user-select:none;
    -webkit-user-select:none;
    -ms-user-select:none;
    user-select:none;
  }
}
</style>


属性归纳:

属性说明默认值数据类型可选值
date显示的时间,非范围类型当前系统时间new Date()String,Object,Date传入格式可以是date类型,或者字符串类型"2018-06-18"
type日期格式eg:2020年-5-30或eg: 2020年5月YYYY-MM-DDStringYYYY-MM-DD 或 words
iconType图标类型<>或《》iconStringicon或 yearIcon (年翻页)
disabledPrev左边按钮是否禁用falseBooleantrue或false
disabledNext右边按钮是否禁用falseBooleantrue或false
isWeek是否是周范围falseBooleantrue或false
week周范围时间当前周的范围Array自定义一周范围,传入格式可以是date类型,或者字符串类型[“2020-06-15”,“2020-06-21”]

事件说明:

事件名说明
leftClick点击左侧按钮触发事件
rightClick点击右侧按钮触发事件

去具体界面使用:

<!-- 日期组件   -->
    <h3>xx年xx月</h3>
    <div style="padding:0 20px 20px;">
      <myDate type="words"></myDate>
      左边禁用
      <myDate disabledPrev type="words"></myDate>
      右边禁用
      <myDate disabledNext type="words"></myDate>
    </div>

    <h3>xx年xx月考核</h3>
    <div style="padding:0 20px 20px;">
      <myDate date="2010-09" type="words"><slot><span>考核</span></slot></myDate>
    </div>

    <h3>xxxx-xx-xx</h3>
    <div style="padding:0 20px 20px;">
      <myDate date="2020-09-18"></myDate>
    </div>

    <h3>xxxx年</h3>
    <div style="padding:0 20px 20px;">
      <myDate type="year" date="2024" iconType="yearIcon"></myDate>
    </div>

    <h3>xxxx-xx-xx 至 xxxx-xx-xx</h3>
    <div style="padding:0 20px 20px;">
      当前周
      <myDate isWeek @leftClick = "leftClick"></myDate>
      传任意周一至周末整周
      <myDate :week="week" isWeek ></myDate>
    </div>
 import myDate from '@/components/myDate'
data(){
      return{
        week:['2020-06-15','2020-06-21'] // 传周一开始到周日结束的周期范围
      }
    },
    methods:{
      leftClick(val){
        console.log(val,'ggeeeeeeeeeee')
      },
   }
Antd日期组件汉化失效排查:从ConfigProvider到dayjs的完整解决方案 本文详细解析了Ant Design日期组件汉化失效的常见原因,指出问题根源在于仅配置了ConfigProvider而忽略了底层dayjs库的语言设置。文章提供了从安装依赖、正确导入语言包到全局配置的完整解决方案,并针对Vite、Next.js等场景给出了进阶排查指南和最佳实践,帮助开发者彻底解决中英文混杂问题。 阅读详情

相关推荐

Ant Design Vue 3.x 日期组件中文显示问题:Day.js 与全局国际化配置详解

国际化(i18n)是现代前端应用开发中的基础能力,它涉及语言、日期、数字等多维度本地化适配。其核心原理是通过配置语言包和地区格式规则,实现界面内容的动态切换,以提升应用在不同区域用户中的可用性。在技术实现上,组件库的国际化体系往往分层处理,其中日期时间格式化通常依赖独立的底层日期库(如 Day.js)。Ant Design Vue 作为流行的 Vue 3 组件库,其日期选择器(DatePicker)等组件的本地化就依赖于 Day.js 的配置。若仅配置组件库的语言包而忽略 Day.js 的 locale 设

weixin_34379433的博客 361

【Element-ui】Icon 图标与Button 按钮

在前端开发中,界面的设计和交互是至关重要的一部分。一个直观、易用的界面往往离不开各种组件的运用。本文将聚焦于Element-ui中的两个常用组件——Icon图标和Button按钮,分别介绍它们的基本用法和一些实用技巧。Icon图标为界面添加了更多的元素,而Button按钮则是用户与页面进行交互的重要媒介,通过深入理解它们,我们可以更好地打造出美观、实用的前端界面。在本文中,我们深入了解了Element-ui中的Icon图标和Button按钮的基本用法和实用技巧。

m0_62599305的博客 4万+

Axure高级日期组件设计:从单日到范围选择的交互全解析

本文深入解析了在Axure中设计高级日期组件的完整流程。从单日选择的基础交互逻辑出发,逐步拆解了时间复合选择器与日期范围选择器的复杂实现,重点阐述了如何利用动态面板、中继器和全局变量来构建丝滑的用户体验与严谨的状态管理,并分享了提升组件可用性与可访问性的企业级实践技巧。

r2s3t4的博客 217

Element UI 的el-button 内置那些icon图标

Element UI 内置的图标类名可以在 Element UI 的官方文档中找到。组件支持内置的图标,你可以通过设置。Element UI 的。

文都龙哥 2988

Android Geckoview实战:5分钟搞定JS与原生交互(附完整Demo代码)

本文详细介绍了在Android应用中使用GeckoView替代系统WebView,构建稳定高效的JavaScript与原生代码交互桥梁的实战方法。通过WebExtension架构,文章提供了从环境配置、扩展开发到Android端集成的完整步骤,并附有可运行的Demo代码,帮助开发者快速解决混合应用中的兼容性问题。

u5v6w7的博客 936

深入解析DDR5 SDRAM中的CA训练模式(CATM):原理与实现

本文深入解析DDR5 SDRAM中的CA训练模式(CATM),详细探讨其工作原理与实现方法。通过分析JESD79-5标准,揭示CATM在时序校准、信号质量优化和系统稳定性方面的核心价值,并提供硬件设计考量和系统级调试技巧,帮助工程师解决高速内存系统中的信号完整性问题。

weixin_29235923的博客 384

前端vue3点击箭头切换日期

el-date-picker v-model="currentMonth" type="month" value-format="YYYY-MM-DD" placeholder="请选择月度"// 样式 class="flex gap-2 items-center" 使用的是一个样式库 需要下载。// 左箭头事件 使用了dayjs带的方法 需要下载引入day.js 请参考官网。//定义v-model绑定的currentDate。// 赋值 具体根据实际情况赋值。//引入day.js。

2201_75390645的博客 967

科研绘图避坑指南:用PyMol制作期刊级蛋白-配体相互作用图(含氢键显示技巧)

本文是一份专业的科研绘图避坑指南,详细讲解如何利用PyMol软件制作符合期刊发表标准的蛋白-配体相互作用图。文章重点分享了从构图逻辑、精准选择到氢键等相互作用的艺术化表达技巧,并提供了视觉优化与期刊适配的终极参数设置,帮助科研人员产出兼具科学严谨性与视觉美感的专业图表。

weixin_29292431的博客 270

vue 左滑右滑实现年份月份切换

1.定义数据 selectYear: day().year(), selectMonth: day().month() + 1, 2.结构 <div class="date_picker"> <van-button @click="pre()"> <van-icon name="arrow-left" /> </van-button> <span>{{ `${selectYear}年${selectMonth}

seimeii的博客 1056

告别电机啸叫!手把手教你配置TMC5160的StealthChop2静音模式(附参数自整定避坑指南)

本文详细介绍了如何通过配置TMC5160的StealthChop2模式彻底消除3D打印机电机噪音。从硬件准备到参数自整定,再到高级调优与异常处理,手把手教你实现实验室级别的静音效果,提升打印质量和使用体验。

weixin_33724659的博客 487

【1】Python交叉编译到OpenHarmony标准系统运行(arm32位)

本文介绍如何Python语言如何在OpenHarmony标准系统运行,包括5.0r和4.1r以及4.0r,和未来版本的OpenHarmony版本上。 Python语言在OpenHarmony上使用,需要将Python解释器CPython移植到OpenHarmony标准系统。通过交叉编译的方式。

weixin_58069108的博客 930

uni-app X 可用的时间选择器 年、月、日、时、分

uni-app X 时间选择器

qq_28754547的博客 724

【软考】高项论文写作常见模板

本文主要介绍了YYYY年MM月DD日,我所在公司承接了XXXX项目的建设过程,包括了XXX,XXX,XXX内容,涉及到XXX,XXX,XXX技术。本人在项目中承载着项目经理的角色,主要负责了XXX,XXX,XXX方面事宜。此项目时间紧,任务重,实施过程中,我们特别注重了1、XXX 2、XXX 3、XXX几个方面,经过团队的一致努力,本项目按时交付,运行至今,客户反馈良好。但是在实施过程中,也曝露除了一些问题,包括了XXX,XXX等,通过应急处理和协调,这些问题都得到了妥善解决,没有影响到项目进度。

奶爸的编程之路,也就一周冷个三天 1687

3分钟实现Layui日期组件清空功能:从痛点到完美解决方案

你是否遇到过这样的情况:使用Layui日期组件(laydate)时,用户选错日期后想一键清空却找不到按钮?别担心,本文将带你用三种方案实现这个实用功能,让表单操作更流畅。读完你将学会:基础清空按钮启用、自定义清空按钮实现、以及结合表单验证的高级应用。 ## 官方基础方案:启用内置清空按钮 Layui日期选择器(laydate)其实自带清空功能,只是默认未启用。通过配置`btns`参数即可快速调...

gitblog_01014的博客 385

Python爬虫实战:利用最新技术爬取抖音话题挑战视频

本文将详细介绍如何使用Python最新技术栈构建一个高效的抖音话题挑战视频爬虫。我们将从环境配置开始,逐步讲解请求模拟、数据解析、反反爬策略、数据存储等关键环节,并提供完整的代码实现。本文适合有一定Python基础的开发者学习高级网络爬虫技术。关键词:Python爬虫、抖音API、话题挑战、视频爬取、反反爬本文详细介绍了如何使用Python最新技术栈构建抖音话题挑战视频爬虫。我们从基础请求开始,逐步实现了数据解析、反反爬策略、数据存储等核心功能,并探讨了分布式和增量爬取等高级主题。更智能的反反爬策略。

2201_76125261的博客 1744

torch.nn.rnn实现循环神经网络

------------------------------------nn.rnn模型实现。#------------------------------------模型实现。#-----------------------------------训练模型。#-----------------------------------训练模型。#--------------------------------读取数据。实现循环神经网络,并在至少一个数据集上进行实验,从训练时间、预测精度、...

matlab_python22的博客 2971

改写element-ui中的日期组件

  如果你想实现一个自定义的日期组件规则如下:日期组件未点开前左右两边有前一天后一天控制箭头,且前一天后一天有数据时才显示箭头,没有数据时,快速切换箭头隐藏。当日期组件点开后,有数据的天为可点击状态,无数据的为不可点击状态。   那么,我们可以在已有的element-ui日期组件的基础上去实现这个功能。   如下是element-ui中给的例子,表示日历中时间大于当前时间的天数均为不可点击状态...

weixin_30641999的博客 362

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

antd vue关于日期组件的一些坑

v-mode绑定值和default-value默认值绑定空字符串会提示错误需要是null或者moment对象使用要下载moment对象以及引入 <a-date-picker v-model="Time" :default-value="Time" show-time format="YYYY-MM-DD HH:mm:ss" placeholder="开始时间" /> import moment from "moment"; export default{ data(){ retur

weixin_47309568的博客 2283

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

js做通过点击按钮来判断文本框内容是否非空_回填报表这样做才对,做表正确姿势来啦...

“ 一乡二里 共三夫子 不识四书五经六艺 竟敢教七八九子 十分大胆十报九看 有八回填 做表七遍六次五回 只采用四三二张 一筹莫展”做表“七遍六回五次”,最后却只被“采用四三二张”,你是否也是如此的“一筹莫展”呢。每天面对大量的数据和业务部门的需求轰炸,报表工作者们常常苦不堪言,对接需求嗯嗯嗯,提交报表NONONO,尤其是回填报表需求。为什么你反复的做回填报表,最后只采用了一两张呢?回填表往往都是复...

weixin_32157619的博客 583

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Element UI DatePicker 日期选择器完全指南:类型、格式、范围选择与快捷选项实战

Element UI 是 Vue.js 2.0 生态中广泛使用的 UI 组件库,`DatePicker` 日期选择器是其表单体系中最重要的组件之一。本指南以 Element UI 官方文档([examples/docs/zh-CN/date-picker.md](https://link.gitcode.com/i/1fdfd0916d43b68007925728bc1d9a8b))为核心骨架,结

gitblog_01110的博客 871

Qt自定义DateTime控件--实现日历及时间选择器自定义

怎样能够完全地实现一个不用其他控件就能正常使用的控件。最近尝试了下,使用了Qt的基础控件实现了一个完全自定义的日历控件,顺便改良了一下以前的时间选择器,测试效果还可以。终于实现了自定义的DateTime控件。......

slowlytalk 1万+

vant显示日期格式_vant van-datetime-picker 日期组件设置选择范围当前时间到一年以内...

直接贴代码1.调用日期组件2.定义变量,最小时间就是当前时间data() {return {value: '',timeValue: '',currentDate: new Date(),changeDate: new Date(),minDate: new Date(),show: false, // 用来显示弹出层};3. 通过计算属性算出最大时间并返回computed: {maxDate()...

weixin_39922683的博客 3096

文本框为空时val()会获取到什么_为什么你做回填报表一筹莫展,用这个BI工具快人一步...

出对!一乡二里 共三夫子 不识四书五经六艺 竟敢教七八九子 十分大胆十报九看 有八回填 做表七遍六次五回 只采用四三二张 一筹莫展做表“七遍六回五次”,最后却只被“采用四三二张”,你是否也是如此的“一筹莫展”呢。每天面对大量的数据,报表工作者们常常苦不堪言。为了收集并整理数据,常常需要制作回填报表来对数据进行收集入库。为什么你反复的做报表,最后只采用了一两张呢?因为忽略一个重要的点,回填报表的制作...

weixin_39746241的博客 142

React 16.x折腾记 - (10) UmiJS 2.x + antd 重写后台管理系统记录的问题及解决姿势

前言 用的是umi 2.x ,写起来挺舒服;顺带完善了上一版本后台的一些细节问题,功能等 umijs类似create-react-app, 也是一套方案的集合体,亮点很多.可以具体官网去看 声明式的路由(nuxtjs既视感) dva(基于redux+redux-saga的封装方案):写起来有vuex的感觉; 主要记录我在过程中遇到的问题及解决的姿势,技术栈 antd 3.11.x + umi ...

CRPER 3700

保姆级教程:用Antd 5.x最新姿势搞定日期组件中文化(含Vue3版本对比)

本文提供了一份详细的Antd 5.x日期组件中文化解决方案,重点解析了使用ConfigProvider进行全局配置的核心步骤。文章深入对比了React与Vue3技术栈下的实现差异,并强调了结合dayjs进行日期库区域设置的关键性,帮助开发者彻底解决月份、星期等显示英文的常见问题。

sunny的博客 227

Fullcalendar日期组件实现如备忘录或日程提示的小程序

这里的event对应的就是每一个小的空白处,所以可以用event.start时间,获得时间后的处理方式和上面的处理方式一样,id同理,让后通过异步请求发送到后端servlet,servlet获取数据后调佣dao里的方法对数据库里的数据进行更改。这里的拖拽主要是因为前端进行了拖拽但是数据库里的数据没有进行相应的更改,使用本质是对数据库进行更新操作。这里的select里的function主要的作用是获得点击空白的时间,并通过一些列操作拼接成字符串。最后通过layui的layui。好了今天的分享就到这里!

hhahahhahahhha的博客 1453
上一篇: 解决elementUI中表格的行(cell)设置固定的高度后,垂直居中失效问题
下一篇: elementUI中表单校验中,所有空值校验在用户点击“确定”按钮时才触发,失去焦点时只有有值,才进行其它有效性校验;
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值