Неопределенные реквизиты в componentDidMount - PullRequest
0 голосов
/ 17 февраля 2019

Это начинает очень расстраивать.По сути, я не могу получить доступ к props в моих подкомпонентах.если я пытаюсь отобразить их напрямую, используя this.props - это работает, но если мне нужно выполнить с ними дополнительные процессы или сохранить их в state, я получаю неопределенный реквизит все время.У меня есть родительский компонент, который выглядит примерно так:

import React from 'react';

import Title from './EventSubComponents/Title';
import SessionInfo from './EventSubComponents/SessionInfo';
import SessionTime from './EventSubComponents/SessionTime';
import Location from './EventSubComponents/Location';
import Subscribers from './EventSubComponents/Subscribers';

class EventNode extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      'event': [],
    }
  }

  componentDidMount() {
    this.getEvent(this.props.location.selectedEventId);
  }

  getEvent(eventId) {
    fetch('/api/v.1.0/event/' + eventId, {mode: 'no-cors'})
      .then(function(response) {
        if(!response.ok) {
          console.log('Failed to get single event.');
          return;
        }
        return response.json();
      })
      .then((data) => {
        if (!data) {
          return;
        }
        this.setState({
          'event': data
        })
      });
  }

  render() {
    return(
      <div className="event-wrapper">
        <Title 
        title = { this.state.event.title } 
        date = { this.state.event.start }
        />
        <SessionInfo 
          distance = { this.state.event.distance }
          type = { this.state.event.type }
        />
        <SessionTime 
          start = { this.state.event.start }
          end = { this.state.event.end }
        />
        <Location location = { this.state.event.start_location }/>
        <Subscribers 
        subscribers = { this.state.event.subscribers } 
        eventId = { this.state.event._id }
        />
      </div>
    );
  }
}

export default EventNode;

И мой подкомпонент SessionTime, который выглядит так:

import React from 'react';
import moment from 'moment';

class Title extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      'title': '',
      'date': '',
    }
  }

  componentDidMount() {
    console.log(this.props.title);
    console.log(this.props.date);
    // undefined both props.
    this.convertToTitleDate(this.props.date);
    this.setState({
      'title': this.props.title
    })
  }

  convertToTitleDate(date) {
    var newDate = moment(date).format('dddd, Do MMMM')
    this.setState({
      'date': newDate,
    });
  }

  render() {
    return (
      <div className="event-title-wrapper">
        <h1> { this.state.title } </h1>
        <div className="event-title-date"> { this.state.date } </div>
      </div>
    );
  }
}

export default Title;

Может кто-нибудь объяснить, почему обаthis.props.date и this.props.title не определены в моей функции componentDidMount?В моем EventNode есть еще пара компонентов, и у меня есть те же проблемы.

Изменение componentDidMount на componentWillMount не помогает.Я вполне уверен, что у меня есть проблемы с моим родительским компонентом EventNode, но я не могу понять, где.Внутри EventNode render() определены все переменные состояния.

1 Ответ

0 голосов
/ 17 февраля 2019

Вы инициализируете event в пустой массив и передаете this.state.event.start и this.state.event.end в SessionTime, что при первом рендеринге будет равно undefined, так как event еще не загружен и нетstart и end свойства массива.

Вместо этого можно, например, изначально установить event в null и возвращать null из метода рендеринга до тех пор, пока не будет загружен event.

Пример

class EventNode extends React.Component {
  state = {
    event: null
  };

  // ...

  render() {
    const { event } = this.state;

    if (event === null) {
      return null;
    }

    return (
      <div className="event-wrapper">
        <Title title={event.title} date={event.start} />
        <SessionInfo distance={event.distance} type={event.type} />
        <SessionTime start={event.start} end={event.end} />
        <Location location={event.start_location} />
        <Subscribers
          subscribers={event.subscribers}
          eventId={this.state.event._id}
        />
      </div>
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...