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

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

<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')
      },
   }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值