基于vant-picker 二次封装 日周月年组件

<template>
<div>
  <van-picker
    show-toolbar
    :columns="columns"
    @cancel="cancel"
    @confirm="onConfirm"
    @change="onChange"
  />
</div>
</template>

<script>
import moment from "moment";
import "moment/locale/zh-cn";
moment.locale("zh-cn");
// 获取一年的周次列表
const weelys = y => {
  const oneDay = moment(y + "-01-01");
  let oneWeely = null;
  if (oneDay.format("wo") == "1周") {
    oneWeely = oneDay.startOf("week").format("YYYY-MM-DD");
  } else {
    console.log("weeks");
    oneDay.add(1, "weeks");
    oneWeely = oneDay.startOf("week").format("YYYY-MM-DD");
  }
  const arr = [];
  let weelyStr = "1周";
  do {
    const d = {};
    let time = moment(oneWeely);
    d.value = time.format("YYYY-MM-DD");
    d.text =
      time.format("第wo") +
      "(" +
      time.startOf("week").format("MM/DD") +
      "-" +
      time.endOf("week").format("MM/DD") +
      ")";
    arr.push(d);
    oneDay.add(1, "weeks");
    oneWeely = oneDay.startOf("week").format("YYYY-MM-DD");
    weelyStr = oneDay.format("wo");
  } while (weelyStr != "1周" && oneWeely.indexOf(y) > -1);
  return arr;
};
//获取一年的月份列表
const months = (y) => {
  let arr = [{text:'1月',value:''},{text:'2月',value:''},{text:'3月',value:''},{text:'4月',value:''},{text:'5月',value:''},{text:'6月',value:''},{text:'7月',value:''},{text:'8月',value:''},{text:'9月',value:''},{text:'10月',value:''},{text:'11月',value:''},{text:'12月',value:''}]
  arr.forEach((item,index) => {
    if(index+1 < 10) {
      item.value = y+'-0'+(index+1)
    }else {
      item.value = y+'-'+(index+1)
    }
  })
  return arr
}
//获取一年的月份列表
const days = (ym) => {
  let arr = []
  let num = getMonthDates(ym.value.split('-')[0],ym.value.split('-')[1])
  for(let i = 1 ;i <= num ;i++) {
    if(i < 10) {
      arr.push({
        text: i+'日',
        value:ym.value.split('-')[0]+'-'+ym.value.split('-')[1]+'-0'+i
      })
    }else {
      arr.push({
        text: i+'日',
        value:ym.value.split('-')[0]+'-'+ym.value.split('-')[1]+'-'+i
      })
    }
  }
  return arr
}
function getMonthDates(year, month){
    var d = new Date(year, month, 0);
    return d.getDate();
}

export default {
  name:'SelectDate',
  props: {
    defaults: {
      type: [Object, String, Date],
      default: () => {
        return moment();
      }
    },
    type:{
      type:[String,Number],
      default:1,
    }
  },
  data() {
    return {
      columns: [
        {
          values: [],
          className: "column1"
        },
      ]
    };
  },
  created() {
    this.setData();
  },
  methods: {
    setData() {
      const defaultData = moment(this.defaults);
      let year = moment().format("YYYY");
      this.columns[0].values = [];
      for (let i = year - 20; i < year - 0 + 1; i++) {
        this.columns[0].values.unshift(i);
      }
      for (let i = 0; i < this.columns[0].values.length; i++) {
        if (this.columns[0].values[i] == year) {
          this.columns[0].defaultIndex = i;
          this.columns[0].valueKey = i;
          break;
        }
      }
      if(this.type == 1) {
        this.columns.push({
          values: [],
          className: "column2"
        })
        this.columns[1].values = months(year)
        this.columns.push({
          values: [],
          className: "column3"
        })
        this.columns[2].values = days({value:year+'-01',text:'1月'})
      }else if(this.type == 2) {
        this.columns.push({
          values: [],
          className: "column2"
        })
        this.columns[1].values = weelys(year);
        for (let i = 0; i < this.columns[1].values.length; i++) {
          if (
            moment(this.columns[1].values[i].value).format("wo") ==
            defaultData.format("wo")
          ) {
           this.columns[1].defaultIndex = i;
           this.columns[1].valueKey = i;
           break;
          }
        }
      }else if(this.type == 3) {
        this.columns.push({
          values: [],
          className: "column2"
        })
        this.columns[1].values = months(year);
      }
    },
    onConfirm(value, index) {
      let val
      if(this.type == 1) {
        val = {
          name:value[0]+'年'+value[1].text+value[2].text,
          value:value[2].value
        }
      }else if(this.type == 2) {
        let a = value[1].text.substring(value[1].text.indexOf('(')+1,value[1].text.indexOf(')'))
        a.split('-')
        let start = value[0]+ '-' +a[0].split('/').join('-')
        let end = value[0]+ '-' +a[1].split('/').join('-')
        val = {
          name:value[0]+'年'+value[1].text.substr(0,value[1].text.indexOf('(')),
          value:start+'/'+end
        }
      }else if(this.type == 3) {
        val ={
          name:value[0]+'年'+value[1].text,
          value:value[1].value
        }
      }else if(this.type == 4) {
        val ={
          name:value[0]+'年',
          value:value[0]
        }
      }
      this.$emit("onConfirm", val);
    },
    onChange(picker, values) {
      if(this.type == 1) {
        picker.setColumnValues(1, months(values[0]));
        picker.setColumnValues(2, days(values[1]));
      }else if(this.type == 2) {
        picker.setColumnValues(1, weelys(values[0]));
      }else if(this.type == 3) {
        picker.setColumnValues(1, months(values[0]));
      }
      this.$emit("onChange", values);
    },
    cancel() {
      this.$emit("cancel");
    }
  }
};
</script>



<style>
</style>

 然后使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值