Реагирует состояние волшебным образом меняется без причины - PullRequest
0 голосов
/ 14 мая 2018

Я использую React для календарного приложения.Я получаю данные из API за определенные даты, чтобы получать данные только за 1 неделю из базы данных.

Когда я получаю данные из API следующим образом:

export default class CalendarApp extends React.Component {
  state = {
    months: moment.months(),
    day: moment.weekdays(),
    daysPerMonth: moment().daysInMonth(),
    startDate: moment(),
    date: moment().year(2017).month(0).date(1).format('l'),
    firstWeekDay: 0,
    data: [],
    minDate: moment().year(2017).month(0).date(1),
    maxDate: moment().year(2018).month(11).date(31)
  };
  componentDidMount() {


    const startDate = this.state.startDate.day(this.state.firstWeekDay).unix();
    const endDate = this.state.startDate.day(this.state.firstWeekDay).add(1, 'week').unix();
    console.log(`I am fetching data between ${moment.unix(startDate).format("MM/DD/YYYY")} and ${moment.unix(endDate).format("MM/DD/YYYY")}`);

    // console.log(this.state.startDate.day(this.state.firstWeekDay));

    axios.get(`http://localhost/api/date?startDate=${startDate}&endDate=${endDate}`).then((response) => {
      this.setState(() => ({ data: response.data}));
    });
  };

Затем магическое изменение startDate (оно добавляет 1 неделю, как у меня в переменной endDate, даже если я никогда не использую setState для этого).В результате мое приложение календаря не работает, и оно всегда загружается за неделю до того, как мне нужно, а не за текущую неделю.Например, если в моем календаре отображаются дни с 20/05/2018 по 26/05/2018, я получаю данные из API за дни с 13/05/2018 по 05/20/2018.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я никогда не использовал момент, но я нашел это в документации:

Примечание. Следует отметить, что моменты изменчивы.Вызов любого из методов манипуляции изменит исходный момент.

https://momentjs.com/docs/#/manipulating/

, поэтому при вызове

this.state.startDate.day(this.state.firstWeekDay).add(1, 'week').unix();

Itизмените дату начала и верните ее.

Надеюсь, она вам поможет.

0 голосов
/ 14 мая 2018

Вы напрямую изменяете состояние в componentDidMount и, следовательно, оно обновляется.используйте метод .clone() для объекта момента, чтобы клонировать его перед внесением каких-либо изменений

componentDidMount() {
    let startDate = 
this.state.startDate.clone()
    startDate = startDate.day(this.state.firstWeekDay).unix();
    const endDate = this.state.startDate.clone().day(this.state.firstWeekDay).add(1, 'week').unix();
    console.log(`I am fetching data between ${moment.unix(startDate).format("MM/DD/YYYY")} and ${moment.unix(endDate).format("MM/DD/YYYY")}`);

    // console.log(this.state.startDate.day(this.state.firstWeekDay));

    axios.get(`http://localhost/api/date?startDate=${startDate}&endDate=${endDate}`).then((response) => {
      this.setState(() => ({ data: response.data}));
    });
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...