vant2 周次选择器-可选的时间范围

vant2 周次选择器-可选的时间范围

版本
"moment": "^2.30.1",
"ant-design-vue": "^1.7.8",
  • 使用组件:Picker 选择器

  • :defaults=“defaults” 默认时间 类型:Date

  • :minDate=“minDate” 可选的最小时间 类型:Date

  • :maxDate=“maxDate” 可选的最大时间 类型:Date

  • 通过 min-date 和 max-date 属性可以确定可选的时间范围。

  • 效果展示

周次选择器

// 子组件 changWeely.vue

<template>
  <van-picker title="选择周次" show-toolbar :columns="columns" @cancel="cancel" @confirm="onConfirm" @change="onChange" />
</template>

<script>
import { Picker, Toast } from 'vant';
import 'vant/lib/index.css';
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;
};



export default {
  props: {
    defaults: {
      type: [Object, String, Date],
      default: () => {
        return moment();
      }
    },
    minDate: {
      type: Date,
      default: new Date()
    },
    maxDate: {
      type: Date,
      default: new Date()
    },
  },
  data() {
    return {
      columns: [
        {
          values: [],
          className: "column1"
        },
        {
          values: [],
          className: "column2"
        }
      ]
    };
  },
  components: {
    [Picker.name]: Picker,
    [Toast.name]: Toast,
  },
  created() {
    this.setData();
    this.columns[1].values = this.filterDate(this.columns[1].values)
  },
  methods: {
    setData() {
      const defaultData = moment(this.defaults);
      let year = moment().format("YYYY");
      let minYear = moment(this.minDate).format("YYYY")
      let maxYear = moment(this.maxDate).format("YYYY")
      this.columns[0].values = [];
      for (let i = minYear; i <= maxYear; 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;
        }
      }
      console.log(this.columns);
      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;
        }
      }
    },
    // 设置可选范围
    filterDate(arr) {
      const res = arr.map(i => {
        if (moment(i.value).isBefore(this.minDate)) {
          i['disabled'] = true
        }
        if (moment(i.value).isAfter(this.maxDate)) {
          i['disabled'] = true
        }
        return i
      })
      // console.log('filterDate:', res)
      return res
    },
    onConfirm(value, index) {
      this.$emit("onConfirm", value);
    },
    onChange(picker, values) {
      picker.setColumnValues(1, this.filterDate(weelys(values[0])));
      this.$emit("onChange", values);
    },
    cancel() {
      this.$emit("cancel");
    }
  }
};
</script>

// 父组件 

<template>
  <div>
    <div @click="onclickWeek">请选择周:{{ statrtime }} - {{ endtime }}</div>
    <van-popup v-model="showPicker" position="bottom" custom-style="height: 20%;" round>
      <changWeely :defaults="defaults" :minDate="minDate" :maxDate="maxDate" @onConfirm="onConfirm"
        @cancel="onCancel" />
    </van-popup>
  </div>
</template>
<script>
import { Popup, Toast } from 'vant';
import 'vant/lib/index.css';
import changWeely from './components/changWeely.vue'
import moment from "moment";
import "moment/locale/zh-cn";
moment.locale("zh-cn");

export default {
  data() {
    return {
      showPicker: false,
      defaults: new Date(), // 设置默认时间 - 注意月份是从0开始
      statrtime: '',
      endtime: '',
      minDate: new Date("2024/01/09"),
      maxDate: new Date("2024/08/31"),
    }
  },
  components: {
    [Popup.name]: Popup,
    [Toast.name]: Toast,
    changWeely,
  },
  methods: {
    onclickWeek() {
      this.showPicker = true
    },
    // 周的弹框
    onConfirm(date) {
      console.log(date);

      let value = date[1].value

      console.log('time:' + value);

      this.statrtime = moment(value).format('YYYY/MM/DD')
      this.endtime = moment(value).add(6, 'days').format('YYYY/MM/DD')

      // 处理接口
      // this.getHistoryData()
      this.showPicker = false;
    },
    onCancel() {
      this.showPicker = false;
    },
  },
}
</script>

相关链接:https://vant-ui.github.io/vant/v2/#/zh-CN/picker#duo-lie-xuan-ze

### 使用 Vant 的 DatetimePicker 组件设置 `min-date` 属性 在微信小程序开发中,Vant 提供了一个强大的日期选择器组件——DatetimePicker。通过该组件的 `min-date` 属性,可以限制用户可选的最小日期范围。 以下是关于如何配置 `min-date` 属性的具体说明以及示例代码: #### 1. 设置 `min-date` 属性 `min-date` 是一个必填属性,用于指定用户可以选择的最早日期。其值是一个表示时间戳的整数(单位为毫秒)。如果未设置此属性,则默认允许用户选择任意早的历史日期[^1]。 为了实现仅能选择今天及以后日期的功能,可以通过 JavaScript 动态计算今天的起始时刻并将其转换成毫秒级时间戳作为 `min-date` 的值。 #### 2. 示例代码 以下是一段完整的代码片段,展示了如何初始化 `min-date` 和绑定数据源: ```javascript Page({ data: { currentDate: new Date().getTime(), // 默认显示当前时间 minDate: new Date(new Date().setHours(0, 0, 0, 0)).getTime() // 计算当天零点的时间戳 }, onChange(event) { this.setData({ currentDate: event.detail }); }, onConfirm(event) { const { detail } = event; console.log('Selected date:', detail); } }); ``` 对应 WXML 文件中的结构如下所示: ```xml <van-datetime-picker type="date" :value="currentDate" :min-date="minDate" @change="onChange" @confirm="onConfirm"/> ``` 上述代码实现了以下功能: - 初始化 `minDate` 参数为当日凌晨零点的时间戳。 - 用户无法滚动至小于今日之前的日子。 - 当前选定时间为实时更新,默认指向此刻;当确认按钮被触发时打印最终选取的结果。 #### 3. 注意事项 需要注意的是,在实际项目应用过程中还需要考虑跨端兼容性和用户体验优化等问题。比如某些特殊场景下可能需要额外处理边界条件或者调整样式来满足设计需求[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值