0

设想 :

  • 目前正在做日历
  • 使用 React-Day-Picker。

问题 :

  • 我有两个日历- 一个带有星期选择,一个带有日期选择。
    选择一周后,我可以在第二次单击后选择一天,将其设为一个日历的最佳方法是什么?

代码:

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import DayPicker from 'react-day-picker';
import Helmet from 'react-helmet';
import 'react-day-picker/lib/style.css';
import moment from 'moment'

function getWeekDays(weekStart) {
  const days = [weekStart];
  for (let i = 1; i < 7; i += 1) {
    days.push(
      moment(weekStart)
        .add(i, 'days')
        .toDate()
    );
  }
  return days;
}

function getWeekRange(date) {
  return {
    from: moment(date)
      .startOf('week')
      .toDate(),
    to: moment(date)
      .endOf('week')
      .toDate(),
  };
}

class App extends Component {
  constructor(props) {
    super(props);
    this.handleDayClick = this.handleDayClick.bind(this);
    this.state = {
      selectedDay: null,
      hoverRange: undefined,
      selectedDays: [],
    };
  }

  handleDayChange = date => {
    this.setState({
      selectedDays: getWeekDays(getWeekRange(date).from),
    });
  };

  handleDayEnter = date => {
    this.setState({
      hoverRange: getWeekRange(date),
    });
  };

  handleDayLeave = () => {
    this.setState({
      hoverRange: undefined,
    });
  };

  handleWeekClick = (weekNumber, days, e) => {
    this.setState({
      selectedDays: days,
    });
  };

  handleDayClick(day, { selected }) {
    this.setState({
      selectedDay: selected ? undefined : day,
    });
  }
  render() {

    const { hoverRange, selectedDays } = this.state;

    const daysAreSelected = selectedDays.length > 0;

    const modifiers = {
      hoverRange,
      selectedRange: daysAreSelected && {
        from: selectedDays[0],
        to: selectedDays[6],
      },
      hoverRangeStart: hoverRange && hoverRange.from,
      hoverRangeEnd: hoverRange && hoverRange.to,
      selectedRangeStart: daysAreSelected && selectedDays[0],
      selectedRangeEnd: daysAreSelected && selectedDays[6],
    };
    return (
      <div className="App">
      <div>
      <DayPicker
        selectedDays={this.state.selectedDay}
        onDayClick={this.handleDayClick}
      />
      <p>
        {this.state.selectedDay
          ? this.state.selectedDay.toLocaleDateString()
          : 'Please select a day '}
      </p>
    </div>
    <div className="SelectedWeekExample">
        <DayPicker
          selectedDays={selectedDays}
          showWeekNumbers
          showOutsideDays
          modifiers={modifiers}
          onDayClick={this.handleDayChange}
          onDayMouseEnter={this.handleDayEnter}
          onDayMouseLeave={this.handleDayLeave}
          onWeekClick={this.handleWeekClick}
        />
        {selectedDays.length === 7 && (
          <div>
            {moment(selectedDays[0]).format('LL')} –{' '}
            {moment(selectedDays[6]).format('LL')}
          </div>
        )}
      </div>
      </div>
    );
  }
}

export default App;


我愿意接受所有建议,请提出建议。
谢谢!

4

1 回答 1

0

好的,我明白了。我用过这样的东西,效果很好。

  handleDayChange = date => {
    this.setState({
      selectedDays: getWeekDays(getWeekRange(date).from),
      clicked: this.state.clicked +1
    })
    if((this.state.clicked ==1)) {
      this.setState({
        clicked: 0,
        selectedDay:date
      })
      if(this.state.selectedDay){
        this.setState({selectedDays:date})
      }
    }
  };
于 2018-08-09T11:19:30.320 回答