Значение свойства не определено в методе ReactJS render()

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я пытаюсь создать простой класс react, который при рендеринге возвращает заголовок и изображение на основе пути к изображению, который он получает в реквизитах от своего родительского компонента.

Каждый раз, когда я пытаюсь получить доступ к свойству this.props.eImage (путь к локальному изображению) значение указанного свойства не определено, как в eImage: undefined для первых двух рендеров (компонент по неизвестным причинам отображается 4 раза). У меня есть доступ к свойству, но по какой-то причине не к его значению.

Это приводит к тому, что метод рендеринга выдает ошибку «Не удается найти модуль ‘undefined’.

Я пытался использовать методы жизненного цикла, такие как getDerivedState и component willRecieveProps, чтобы сначала сохранить путь к изображению в состоянии, а затем использовать его при рендеринге, но безрезультатно, оба имеют одинаковый результат.

Это очень расстраивает, потому что это простая задача, но я не могу заставить ее работать. Пожалуйста, помогите. Сокращенный код является:

Родительский :

 import React, {Component} from 'react';
import Title from './Title/Title.js';
import Description from './Description/Description.js';
import OrderSection from './OrderSection/OrderSection.js';
import './excursionStyle.css';

const excursionList = [
  {
    excTitle : "Музейный Дрезден",
    excDescription: `Дрезденская картинная галерея, как всегда, радует :)`} 
  ]

class Excursion extends Component {
    constructor(){
        super();
        this.state = {
        };
      };

    getCurrentIndex = (name) => {
      return excursionList.find(exc =>
        exc.excTitle === name
      )
    }

  componentDidMount() {   
      const currentExcursion = this.getCurrentIndex(this.props.match.params.name);
      this.setState(currentExcursion);
    };
    
    render(){    
      return (
          <div className="body">
            <div className="excursion">
            <Title eTitle={this.state.excTitle} eImage={this.state.excImageUrl}/>
                <Description eDescription = {this.state.excDescription}/>
                <OrderSection eTitle = {this.state.excTitle}/>
          </div>
          </div>
            );
    }
        
}

  

Дочерний :

 import React, {Component} from 'react';
import './Title.css';

class Title extends Component{
    constructor(props){
        super(props);     
    }
    render() {  
        console.log(this.props)
        return (
            <div>
            <header className = "flex">
                <p className = "f2 b">{this.props.eTitle}</p>
            </header>
            <div>
                    <img src={require(this.props.eImage)}></img>                                                                      
            </div>
            </div>    
        );
    }
}

export default Title;
  

Комментарии:

1. Относятся ли эти изображения к вашей папке? Кстати, какие реквизиты вы передаете?

Ответ №1:

Ваш Excursion компонент начинается с этого состояния:

 this.state = {
};
  

Это означает, что при рендеринге Title использование this.state.excImageUrl обращается к свойству, которое не существует в объекте состояния, что приводит к значению undefined . Итак, ваш Title компонент видит eImage значение undefined .

Если Title требуется это свойство, вам не нужно отображать Title , пока оно у вас не будет. Обычно это делается с помощью какой-либо защиты, например (в Excursion ):

 render(){    
  const eImage = this.state.excImageUrl;
  return (
      <div className="body">
        <div className="excursion">
        {eImage amp;amp; <Title eTitle={this.state.excTitle} eImage={eImage}/>
            <Description eDescription = {this.state.excDescription}/>
            <OrderSection eTitle = {this.state.excTitle}/>
        }
      </div>
      </div>
        );
}
  

Обратите внимание на {eImage amp;amp; <Title ... />} структуру, которая является защитной. React игнорирует заполнители выражений, значение выражения которых id undefined или null или false , поэтому, если eImage есть undefined , {eImage amp;amp; <Title ... />} будет undefined ( Title не будет использоваться). Но если eImage это непустая строка (например), {eImage amp;amp; <Title ... />} результатом будет Title .


Примечание относительно:

…компонент по неизвестным причинам отображается 4 раза…

То, как Excursion написано, всегда будет отображаться как минимум дважды: один раз без каких-либо включений state , а затем снова после componentDidMount обновления состояния. Оно также будет отображаться при каждом изменении его реквизитов, поэтому, если (например) его родительский компонент присваивает ему одно match значение для начала, но затем обновляет его другим, оно, скорее всего, будет отображаться три раза. Если родительский компонент повторяется match более одного раза…

Ответ №2:

Решена проблема путем установки состояния исключения перед первым отображением (с использованием componentWillMount). Большое спасибо за ответы.