Почему мой this.props.data не определен нигде перед функцией рендеринга? - PullRequest
0 голосов
/ 11 февраля 2019

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

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

× 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 ]

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

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

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

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

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

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

{this.props.data ? this.props.data.link: ''}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...