日-周-月-年,时间选择组件

19 篇文章 1 订阅
4 篇文章 0 订阅

1.场景

日:默认本日,以日为单位选择;周:默认本周,以周为单位选择;月-年类似

2.组件:

使用antd组件DatePicker

3.效果

4.源码:

/**
 * @name TimeList
 * @desc 日期列表
 * @author 
 * @date 2021/02/03
 */
import React, { Component } from "react";
import { DatePicker } from "antd";
import moment from "moment";
import styles from "./styles.module.less";

const { RangePicker, WeekPicker, MonthPicker } = DatePicker;
const dateFormat = "YYYY-MM-DD";
const timeListTwo = [
  { code: 1, name: "日" },
  { code: 2, name: "周" },
  { code: 3, name: "月" },
  { code: 4, name: "年" }
];
const defaultDate = moment(new Date()).format(dateFormat);

class Anothertime extends Component {
  state = {
    timeCode: 1, //时间code
    startTime: defaultDate, //开始时间
    endTime: defaultDate, //结束时间
    time: defaultDate, //日期
    yearSelect: false //年份选择面板
  };
  /**
   * @name typeChange
   * @param {Number} code 类型code
   * @description 时间类型变化
   */
  typeChange = (code) => {
    this.setState({ timeCode: code });
    this.times(code);
  };
  /**
   * @name times
   * @param string YYYY-MM-DD
   * @description 时间类型所对应的时间
   */
  times = (timeCode) => {
    this.timeCommon(timeCode, new Date());
  };
  /**
   * @name newTimeChange
   * @param {Object} date 标准时间
   * @param {String} dateString 当前选中时间字符串
   * @description 时间变化
   */
  newTimeChange = (date) => {
    const { timeCode } = this.state;
    this.timeCommon(timeCode, date);
  };
  /**
   * @name timeCommon
   * @param {Number} timeCode 时间类型
   * @param {Object} time 标准时间
   * @description 时间变化公用方法
   */
  timeCommon = (timeCode, date) => {
    let startTime = "";
    let endTime = "";
    let time = moment(date).format(dateFormat);
    if (timeCode === 1) {
    //日
      startTime = time;
      endTime = time;
    } else if (timeCode === 2) {
    //周
      startTime = moment(time).startOf("week").format(dateFormat);
      endTime = moment(time).endOf("week").format(dateFormat);
    } else if (timeCode === 3) {
    //月
      startTime = moment(time).startOf("month").format(dateFormat);
      endTime = moment(time).endOf("month").format(dateFormat);
    } else if (timeCode === 4) {
    //年
      let year = moment(time).format("YYYY");
      startTime = year + "-01-01";
      endTime = year + "-12-31";
      time = startTime;
    }
    this.setState({ startTime, endTime, time, yearSelect: false });
  };
  /**
   * @name openYearSelect
   * @description 年分选择面板展示与否
   */
  openYearSelect = () => {
    this.setState({ yearSelect: true });
  };
  render() {
    const { timeCode, time, yearSelect, startTime, endTime } = this.state;
    return (
      <TimeChange
        time={time}
        timeCode={timeCode}
        yearSelect={yearSelect}
        typeChange={this.typeChange}
        newTimeChange={this.newTimeChange}
        openYearSelect={this.openYearSelect}
      />
    );
  }
}
class TimeChange extends Component {
  render() {
    // newTermChange = () => {}
    const { time, timeCode, yearSelect, typeChange = () => {}, newTimeChange = () => {}, openYearSelect = () => {} } = this.props;
    return (
      <div className={styles.time_content}>
        时间段:
        <div className={styles.ul}>
          {timeListTwo.map((v) => (
            <li key={v.code} className={`${styles.inline} ${timeCode === v.code ? styles.active : null}`} onClick={() => typeChange(v.code)}>
              {v.name}
            </li>
          ))}
        </div>
        {timeCode === 1 ? (
          <DatePicker allowClear={false} value={moment(time, dateFormat)} onChange={newTimeChange} />
        ) : timeCode === 2 ? (
          <WeekPicker allowClear={false} value={moment(time, dateFormat)} onChange={newTimeChange} />
        ) : timeCode === 3 ? (
          <MonthPicker allowClear={false} value={moment(time, dateFormat)} onChange={newTimeChange} />
        ) : (
          <DatePicker
            value={moment(time, dateFormat)}
            open={yearSelect}
            mode="year"
            format="YYYY"
            onOpenChange={openYearSelect}
            onPanelChange={newTimeChange}
            allowClear={false}
          />
        )}
      </div>
    );
  }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,el-date-picker组件可以通过设置type属性来选择期和时间的格式,但是并没有提供选择的格式。不过我们可以通过设置value-format属性和picker-options属性来实现选择的功能。具体步骤如下: 1.设置value-format属性为'yyyyw',表示选择期格式为份和数,例如2022第3。 2.设置picker-options属性,其中disabledDate函数用于禁用选择期,我们可以通过判断当前期是否在选择内来实现禁用其他期。 下面是一个示例代码: ```html <template> <div> <el-date-picker v-model="week" type="week" value-format="yyyyw" :picker-options="pickerOptions" placeholder="选择" ></el-date-picker> </div> </template> <script> export default { data() { return { week: '', // 选择 pickerOptions: { disabledDate: (time) => { const currentWeek = this.getWeekNumber(new Date()); // 获取当前 const selectedWeek = this.getWeekNumber(time); // 获取选择 return currentWeek !== selectedWeek; // 禁用非选择 }, }, }; }, methods: { // 获取当前期所在的数 getWeekNumber(date) { const yearStart = new Date(date.getFullYear(), 0, 1); const weekNo = Math.ceil( ((date - yearStart) / 86400000 + 1 + yearStart.getDay()) / 7 ); return weekNo; }, }, }; </script> ``` 在上面的代码中,我们定义了一个el-date-picker组件,设置了type属性为'week',value-format属性为'yyyyw',picker-options属性为一个对象,其中disabledDate函数用于禁用选择期。在disabledDate函数中,我们通过调用getWeekNumber方法获取当前期和选择期所在的数,然后判断它们是否相等来决定是否禁用该期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值