Element UI + VUE + datetimerange + el-date-picker + computed 实现开始结束时间联动

背景

Element UI + VUE + datetimerange + el-date-picker + computed 实现开始结束时间联动

做web管理台时经常需要使用像开始结束时间控件,如:
这样的

<template>
 
  <div class="block">
    <span class="demonstration">带快捷选项</span>
    <el-date-picker
      v-model="value2"
      type="datetimerange"
      :picker-options="pickerOptions"
      range-separator="至"
      start-placeholder="开始日期"
      end-placeholder="结束日期"
      align="right">
    </el-date-picker>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        pickerOptions: {
          shortcuts: [{
            text: '最近一周',
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit('pick', [start, end]);
            }
          }, {
            text: '最近一个月',
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
              picker.$emit('pick', [start, end]);
            }
          }, {
            text: '最近三个月',
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
              picker.$emit('pick', [start, end]);
            }
          }]
        },
        value2: ''
      };
    }
  };
</script>

在element ui 控件中是一个model:value2 ; 但是后端给的接口却是这样的:
在这里插入图片描述

同理还有:first name 、last name 、full name

容易使用的方法

  1. set 方法:直接在表单提交的时候,将一个赋值拆成两个值,然后再传给form表单,达到兼容
  2. get 方法:在页面渲染时获取到表单中start 、 end 时间,将其组装到控件的model :value2

这种是我们比较容易想到,也能实现的方法。但是这种实现属实有点low了 ,可以试试下面的computed方式,来收拢到一个变量计算中实现

computed 实现方法

<el-row :gutter="20">
        <el-col :span="12">
          <el-form-item label="赛季时间范围" prop="startTime">
            <el-date-picker
                v-model="timeRange"
                type="datetimerange"
                :picker-options="pickerOptions"
                range-separator="至"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
                align="right">
            </el-date-picker>
          </el-form-item>
        </el-col>
      </el-row>

export default {
  name: 'activeRangeComponent',
  props: {
    title: {
      type: String,
      default: '标题'
    }
  },
  data () {
    return {
    
      pickerOptions: {
        shortcuts: [{
          text: '最近一周',
          onClick (picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
            picker.$emit('pick', [start, end])
          }
        }, {
          text: '最近一个月',
          onClick (picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
            picker.$emit('pick', [start, end])
          }
        }, {
          text: '最近三个月',
          onClick (picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
            picker.$emit('pick', [start, end])
          }
        }]
      }, 
      infoForm: {
        id: null,
        name: null,
        startTime: null,
        endTime: null
      }
    }
  },
  computed: {
    timeRange: {
      get () {
        console.log('new get ')
        return [this.infoForm.startTime, this.infoForm.endTime]
      },
      set (newVal) {
        console.log('new set ', newVal)
        this.infoForm.startTime = dateChange.dateFormat(newVal[0], null)
        this.infoForm.endTime = dateChange.dateFormat(newVal[1], null)
      }
    }
  },
  methods: {
  },
  mounted () {
  },
  filters: {}
}

这样就可以监听,同时绑定双方的关系,提交表单时,表单model也是更新后的值,dateChange.dateFormat这里是日期格式化函数~~

最后贴一下官方讲解

https://v2.cn.vuejs.org/v2/guide/computed.html

除此之外,如果你仅需要getter 的话也是可以的,computed 默认就是提供getter的,比如像这样:


var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木秀林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值