Почему мой this.props.data не определен нигде перед функцией рендеринга?

Данные передаются от родителя к потомку соответственно, следовательно, они отображаются внутри функции рендеринга, но я не могу использовать это для асинхронной функции, которую мне нужно запустить перед рендерингом.

Если вы видите data.title а также data.link все showa под функцией render, но по какой-то причине они показывают эту ошибку:

× TypeError: Cannot read property 'link' of null

Что я могу альтернативно сделать?

 export default class Highlight extends Component {

state = {
    htmlString: ''
}

 fetchActivity = () => {

    axios({
        method: 'post',
        url: 'api/singleactivity',
        data: { activityLink: "http://play.fisher-price.com" + this.props.data.link }
    })
        .then((res) => {
            this.setState({
                htmlString: res.data
            })
        })
        .catch((err) => {
            console.log('There was an error fetching data', err);
        })

}

componentDidMount() {
    this.fetchActivity()
}

 render() {

    if (this.props.visibility.highlight) {

        return (
            <div>
                <section className="card bg-info"
                    aria-label="Book Detail">
                    <div className="bg-secondary">
                        <h2>{this.props.data.title}</h2>
                        <h2>{this.props.data.link}</h2>
                        <h2>{this.props.data.imageLink}</h2>
                    </div>
                    <br />
                    <div className="row" dangerouslySetInnerHTML={{ __html: this.state.htmlString }}>
                    </div>
                    <br />
                    <div className="bg-warning">
                        {!this.props.visibility.favorites ?
                            <button onClick={() => this.addToFavorites()}> Favorite</button> :
                            <button onClick={() => this.removeFromFavorites()}> Remove</button>}
                    </div>
                </section>
                <br />
            </div>
        )
    } else {
        return null;
    }

}

2 ответа

Решение

Хорошо, смешивая вызовы извлечения и просмотра кода или используя опасно SetInnerHTML, ваша опора this.props.data не всегда имеет значение, и это является прямым источником вашей проблемы.

Так что, конечно, вы используете свой компонент таким образом <Highlight data={stuff} ... /> Вы можете изменить это на что-то вроде {stuff ? <Highlight data={stuff} ... /> : null} поэтому компонент не будет создан в первую очередь, если входные данные еще не готовы.

Что вы можете сделать, это:

{this.props.data ? this.props.data.title : ''}

{this.props.data ? this.props.data.link: ''}
Другие вопросы по тегам