Момент.js | не отображается с предполагаемым форматом даты

Обзор

Я использую moment.js в своем веб-приложении, чтобы пользователь мог выбрать диапазон дат для своего отпуска. После выбора нужного диапазона дат (например, с 1 по 3 ноября) приложение отображает контейнер (в данном случае 3 контейнера) для каждого дня, что позволяет пользователю планировать каждый день. Один из элементов div в этом контейнере содержит дату этого дня, основанную на выбранных исходных датах.

Цель

Мне нужно каждый день иметь дату в формате «МММ-Do-YY» (11 ноября 19). Однако я получаю формат, который включает гораздо больше на каждый день: воскресенье, 10 ноября 2019 г., 00:00:00 по Гринвичу-0500.

Что я пробовал

Я использую функцию обработчика событий onDateChange (см. ниже), где я пытаюсь обеспечить форматирование как начальной, так и конечной даты. OnDateChange обновляется двумя полями ввода в методе рендеринга. После того, как onDateChange устанавливает состояние, у меня есть ul в методе рендеринга, который отображает состояние и создает контейнер для каждого дня. Этот контейнер представляет собой экземпляр компонента с именем DayContainer (код этого компонента приведен ниже).

Мое лучшее предположение о том, что я считаю неправильным

Я думаю, что проблема заключается в методе рендеринга класса DayContainer. Второй div внутри этого — это то, что отображает дату. Я использую this.state.date.toString и думаю, что это то, что нужно изменить.

import React from 'react';
import './ItineraryContainer.css';
import * as moment from "moment";
import DayContainer from '../DayContainer/DayContainer';


class ItineraryContainer extends React.Component {
  constructor(props){
    super(props);

    this.state = {
      startDate: '',
      endDate: '',
      days: [],
    }
  }

  onDateChange(e){
    this.setState({
      [e.target.name]: e.target.value,
    }, () => {

      let startDate = moment(this.state.startDate, "YYYY-MM-DD");
      if(!startDate.isValid()){
        return;
        //returns start date in this format startDate is valid//
      }
      let endDate = moment(this.state.endDate, "YYYY-MM-DD").startOf('day');
      if(!endDate.isValid()){
        return;
        //returns end date in this format if endDate is valid//
      }
      if(endDate.toDate() < startDate.toDate()){
        return;
        //checks whether endDate is greater than startDate
      }
      let numberOfDays = endDate.diff(startDate, 'days') + 1;
        //stores difference between start/end dates
      let days = [];
        //pushes number of days to setState below
      for(let i = 0; i < numberOfDays; i++){
        days.push({
          id: days.length,
          date: startDate.clone().add(i, "days"),
          events: [{
            time: '',
            type: '',
            summary: '',
            notes: '',
          }],
        });
      }
      //outputs the above key/values to days above
      this.setState({
        days: days,
      //grabs days from 'let days' variable on line 42
      })
    });
  }

  addNewDay(index, item) {
    index = index + 1;
    let newDay = {
      id: this.state.days.length,
      date: item.date.clone().add(1, "days"),
      events: [{
        time: '',
        type: '',
        summary: '',
        notes: '',
      }],
    };

    let daysAfter = [...this.state.days.slice(index)];
    daysAfter.forEach((oldDay) => {
      oldDay.date.add(1, 'days');
    })

    this.setState(prevState => {
      let updatedDays = [...prevState.days.slice(0, index), newDay, ...daysAfter];

        return {
          days: updatedDays
        };
      })
    }

  render(){
    return (
      <div className="itinerary-container">

          <h1 className="TripHeader-background-color">TripHeader</h1>

          <input name="startDate" type="date" value={this.state.startDate} onChange={(e) => this.onDateChange(e)}/ >
            {/* captures startDate */}
          <input name="endDate"  type="date" value={this.state.endDate} onChange={(e) => this.onDateChange(e)}/>
            {/* captures endDate */}

          <ul>
            {this.state.days.map((item, index) => (
              <li key={item.id}>
                  <DayContainer day={item} />
                  <button onClick={() => this.addNewDay(index, item)}>Add Day
                  </button>
              </li>
            ))}
          </ul>
      </div>
    )
  }
}

export default ItineraryContainer;

//DayContainer below

import React from 'react';
import './DayContainer.css';
import EventContainer from '../EventContainer/EventContainer';

class DayContainer extends React.Component {
  constructor(props){
    super(props);

    this.state = {
      ...props.day
    };

    this.pushNewEventContainerToState = this.pushNewEventContainerToState.bind(this);
  }

      pushNewEventContainerToState(index) {
        console.log(index);
        index = index + 1;
        let newEvent = {key: this.state.events.length};

        this.setState(prevState => {
          let updatedEvents = [...prevState.events.slice(0, index), newEvent, ...prevState.events.slice(index)];

            return {
              events: updatedEvents
            };
          })
        }

  render(){
    return (
        <div className="day-container-bottom-border">
        <div>
          {this.state.date.toString()}
        </div>
        <div className="DayLabels-container">
          <h1 className="time-margins">Time</h1>
          <h1 className="activity-margins">Activity Summary</h1>
          <h1 className="notes-margins">Notes</h1>
        </div>

          <ul>
            {this.state.events.map((item, index) => (
              <li key={item.key}>
                  < EventContainer event={item} / >
              </li>
                ))}
          </ul>
        </div>
    )
  }
}

export default DayContainer;

person Victor Franco    schedule 13.11.2019    source источник
comment
Я думаю, вы правы насчет местоположения кода проблемы. Можешь поделиться своим <DayContainer />? Вот где вы примените форматирование к дате item.   -  person It'sNotMe    schedule 13.11.2019
comment
Вау, мог бы поклясться, что это было у меня там. Только что добавленное!   -  person Victor Franco    schedule 13.11.2019
comment
Я посмотрю на это через мгновение. Тем временем вы можете изменить свой вывод в ‹IteraryContainer /› для форматирования с таким моментом. ` ‹ul› {this.state.days.map((item, index) =› ( ‹li key={item.id}›{item.date.format('MMM Do YY')}‹/li› ) )} ‹/ul› `   -  person It'sNotMe    schedule 13.11.2019


Ответы (1)


Спасибо за ваше редактирование, чтобы включить <DateContainer />. К сожалению, теперь есть неопределенный <EventContainer />.

Независимо от того, где вы отображаете дату, вы можете использовать метод format от moment до создать желаемый результат.

 <ul> {this.state.days.map((item, index) => ( <li key={item.id}>{item.date.format('MMM Do YY')}</li> ))} </ul>
person It'sNotMe    schedule 13.11.2019
comment
Потрясающе, спасибо! (Что касается контейнера событий, это не имеет значения для целей этого вопроса.) - person Victor Franco; 13.11.2019