0
点赞
收藏
分享

微信扫一扫

Vant时间控件精确到秒

无愠色 2022-03-11 阅读 64

Vant时间控件精确到秒

Vant-ui里面的时间控件最多精确到分钟,但是项目需求要精确到秒钟,
我们可以用popup弹框和picker选择器自己封装一个时间选择控件精确到秒

下面是封装的效果图
在这里插入图片描述

1.components下创建popUpPicker/popUpPicker.vue

<template>
  <div class="popup-pciker-wrap">
    <van-popup v-model="isPicker" position="bottom" @close="close">
      <van-picker
        ref="picker"
        show-toolbar
        title="请选择时间"
        :columns="columns"
        @change="onChange"
        @cancel="cancel"
        @confirm="onConfirm"
      />
    </van-popup>
  </div>
</template>

<script>
export default {
  name: "popup",
  props: ["showPicker", "values"],
  data() {
    return {
      isPicker: false,
      columns: [],
      Mdays:'',//弹窗关闭时月份所在值
      Dindex:null
    };
  },
  mounted() {},
  watch: {
    isPicker(val) {
      !val && this.$emit("changeValue");
      this.columns = [];
      this.getcolumns();
    },
    showPicker(val) {
      this.isPicker = val;
    },
    values(val) {
      if(val==''){
        this.Mdays=''
        this.Dindex=null
      }
    },
  },
  methods: {
    getCountDays(year, month) { //获取某年某月多少天
      var day = new Date(year, month, 0);
      return day.getDate();
    },
    getcolumns() {
      var strtime = this.values;
      var date = new Date(strtime.replace(/-/g, "/"));
      var vmoduletime = date.getTime();
      if(this.values!=''){
        var vmoduledate = new Date(vmoduletime);
      }else{
        var vmoduledate = new Date();//没有传入时间则默认当前时刻
      }
      var Y = vmoduledate.getFullYear() ;
      var M =vmoduledate.getMonth();
      var D = vmoduledate.getDate() ;
      var h = vmoduledate.getHours() ;
      var m = vmoduledate.getMinutes() ;
      var s = vmoduledate.getSeconds();
      console.log(Y , M ,D , h , m , s) //获取每一列索引
      var year = {}; //获取前后十年数组
      year.values = [];
      var Currentday = new Date().getFullYear();
      for (var i = Currentday - 10; i < Currentday + 10; i++) {
        year.values.push(i+'年');
      }
      year.defaultIndex = year.values.indexOf(Y+'年'); //设置默认选项当前年
      this.columns.push(year);
      var month = {}; //获取12月数组
      month.defaultIndex = M;
      month.values = Object.keys(Array.apply(null, { length: 13 })).map(
        function (item) {
          if (+item + 1 <= 10) {
            return "0" + item+'月';
          } else if(+item + 1 == 11){
            return  + item+'月'
          }else {
            return (+item +  0).toString()+'月';
          }
        }
      );
      month.values.splice(0, 1);
      this.columns.push(month);
      //获取当月的天数
      var days = this.getCountDays(Y,this.Mdays==''?M+1:this.Mdays);
      var day = {}; //创建当月天数数组
      day.defaultIndex = this.Dindex==null? D - 1:this.Dindex;
      day.values = Object.keys(Array.apply(null, { length: days+1 })).map(
        function (item) {
          if (+item + 1 <= 10) {
            return "0" + item+'日';
          }  else if(+item + 1 == 11){
            return  + item+'日'
          }else {
            return (+item +  0).toString()+'日';
          }
        }
      );
      day.values.splice(0, 1);
      this.columns.push(day);
      var hour = {}; //创建小时数组
      hour.defaultIndex = h;
      hour.values = Object.keys(Array.apply(null, { length: 24 })).map(
        function (item) {
          if (+item + 1 <= 10) {
            return "0" + item+'时';
          } else if(+item + 1 == 11){
            return  + item+'时'
          }else {
            return (+item +  0).toString()+'时';
          }
        }
      );
      this.columns.push(hour);
      var mi = {}; //创建分钟数组
      mi.defaultIndex = m;
      mi.values = Object.keys(Array.apply(null, { length: 60 })).map(function (
        item
      ) {
        if (+item + 1 <= 10) {
          return "0" + item+'分';
        } else if(+item + 1 == 11){
            return  + item+'分'
          }else {
            return (+item +  0).toString()+'分';
          }
      });
      this.columns.push(mi);
      var ss = {}; //创建秒数数组
      ss.defaultIndex = s;
      ss.values = Object.keys(Array.apply(null, { length: 60 })).map(function (
        item
      ) {
        if (+item + 1 <= 10) {
          return "0" + item+'秒';
        } else if(+item + 1 == 11){
            return  + item+'秒'
          }else {
            return (+item +  0).toString()+'秒';
          }
      });
      this.columns.push(ss);
    },
    onChange(values, a) {//a为所有列备选项值的数组
      var days = this.getCountDays(a[0].substr(0,4), a[1].substr(0,2));
      var newdays = {};
      newdays.values = Object.keys(Array.apply(null, { length: days+1 })).map(
        function (item) {
          if (+item + 1 <= 10) {
            return "0" + item+'日';
          } else if(+item + 1 == 11){
            return  + item+'日'
          }else {
            return (+item +  0).toString()+'日';
          }
        }
      );
      newdays.values.splice(0, 1);
      this.$refs.picker.setColumnValues(2, newdays.values); //设置第三列的值
      this.$refs.picker.setColumnIndex(2, a[2].substr(0,2) - 1); //设置第三列索引
    },
    onConfirm(val, index) {
      console.log(`当前值:${val});
      var endval = val[0].substr(0,4) + "-" +val[1].substr(0,2) + "-" + val[2].substr(0,2) +" " +val[3].substr(0,2) + ":" + val[4].substr(0,2) +":" +val[5].substr(0,2);
      this.$emit("changeValue", endval);
      this.$emit("close", endval);
    },
    cancel() {
      //选择器关闭
      // this.$emit("changeValue");
    },
    close() {
      //弹出层关闭
      var currentM=this.$refs.picker.getColumnValue(1)
      this.Mdays=currentM.substr(0,2)
      this.Dindex=this.$refs.picker.getColumnIndex(2)
      // this.$emit("close");
    },
  },
};
</script>

<style>
.van-picker__cancel {
  visibility: hidden;
}
</style>

2.使用该组件(引入组件路径,注册组件)

<template>
  <div class="popup-pciker-wrap">
     <van-button @click="showup">选择时间</van-button> 
     <van-button @click="deltime">清除时间</van-button>
 	 时间显示:{{getTime}} 
	<popuppicker :values="getTime"   @changeValue="handelChange" ref="popup" :showPicker="showPicker1" @close="close"/>
  </div>
</template>
<script>
import popuppicker from '../../components/popUpPicker/popUpPicker'    //页面引入组件
export default {
  components: {
     popuppicker, //页面注册组件
  },
  data() {
    return {
		getTime:'',
        showPicker1: false,
    };
  },
  methods: {
    showup(){
      this.showPicker1 = true;
    }, 
    handelChange(){ //popup弹窗关闭
       this.showPicker1 = false;             
       },
    close(val){//picker选择器点击确定
      this.getTime=val       
    },
    deltime(){
      this.getTime=''
    },
    
};
</script>

ps:(是刚写代码的小新,有很多不足的地方或者可以优化的代码,请麻烦告知我 ^ - ^ )

举报

相关推荐

0 条评论