VUE 制作日期组件(今日,近3天,近7天)组件 父子传参实现

一、VUE制作日期组件如下图所示,并实现监听父组件动态传参,子组件日期选择事件监听

1、首先对上述组件进行CSS布局,

<template>
  <div>
    <div class="date-picker-box">
      <div class="date-picker-hot-key-box">
        <span>日期范围</span>
        <el-radio-group
                style="margin-top: 8px"
                v-model="dateBtn" size="medium" @change="bindRadioChange">
          <el-radio-button
                  :label="item.label"
                  v-for="item in radioGroup"
                  :key="item.label">{{ item.value }}
          </el-radio-button>
        </el-radio-group>
      </div>
      <el-date-picker
              class="z-data-picker"
              v-model="datePeriod"
              size="medium"
              @change="bindDatePickerChange"
              type="daterange"
              format="yyyy-MM-dd"
              value-format="yyyy-MM-dd"
              range-separator="-"
              start-placeholder="开始日期"
              end-placeholder="结束日期">
      </el-date-picker>
    </div>
  </div>
</template>

<script>
import { getYesterdayDateStr, getLastWeekDateStr, getLastThreeDateStr } from '../utils'
export default {
  name: 'base-date-picker',
  props: {
    initdate: {
      type: Array
    }
  },
  data() {
    return {
      dateBtn: 'last 7 days',
      radioGroup: [
        {
          label: 'today',
          value: '今日'
        }, {
          label: 'last 3 days',
          value: '近3天'
        }, {
          label: 'last 7 days',
          value: '近7天'
        }
      ],
      datePeriod: []
    }
  },
  watch: {
    initdate: function(val, oldval) {
      // 检测父组件值变化
      this.datePeriod = this.initdate
      this.bindDatePickerChange()
    }
  },
  components: {},
  computed: {},
  filters: {},
  methods: {
    triggerSelectDate() {
      this.$emit('select-date', this.datePeriod)
    },
    bindRadioChange() {
      switch (this.dateBtn) {
        case 'today':
          this.datePeriod = Array.of(getYesterdayDateStr(), getYesterdayDateStr())
          this.triggerSelectDate()
          break
        case 'last 3 days':
          this.datePeriod = Array.of(getLastThreeDateStr(), getYesterdayDateStr())
          this.triggerSelectDate()
          break
        case 'last 7 days':
          this.datePeriod = Array.of(getLastWeekDateStr(), getYesterdayDateStr())
          this.triggerSelectDate()
          break
      }
    },
    bindDatePickerChange() {
      this.dateBtn = ''
      this.triggerSelectDate()
    }
  },
  mounted() {
    this.bindRadioChange()
  }
}

</script>

<style lang="scss" rel="stylesheet/scss" scoped>
  @import "../styles/variables";

  .date-picker-box {
    display: flex;
    flex-wrap: wrap;
    .date-picker-hot-key-box {
      margin-right: 30px;
      min-width: 310px;
      span {
        margin-right: 15px;
      }
    }
  }

  .z-data-picker {
    margin-top: 8px;
    min-width: 255px;
  }

</style>
2、测试代码
<template>
    <div >
        <basedatapicker v-on:select-date="handledatachage"  v-bind:initdate="tmpinitdate"></basedatapicker>
    </div>
</template>

<script>

// 组件 方法引入
import basedatapicker from '@/components/base-date-picker'
import { getYesterdayDateStr, getLastWeekDateStr, getThisYearStartDateStr, getThisYearEndDateStr, getYesterdayDate, formatMonthStr, getYearEndDate, getMonthEndDate } from '../../../utils/'
export default {
  name: 'test',
  data () {
    return {
      tmpinitdate: [],
      date: [ ],
      init_date: [
        getLastWeekDateStr(),
        getThisYearEndDateStr()
      ]
    }
  },
  methods: {
    handledatachage(e) {
      this.date = e
    }

  },
  mounted() {
    console.log(this.init_date)
    this.tmpinitdate = this.init_date
  },
  // 声明组件
  components: { basedatapicker }
}
</script>

<style scoped>

</style>

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值