@Shagfey
FullStack JS developer

Почему при загрузке компонента не вызывается getInitialProps?

Делаю переход с главной страницы на страницу "технологии":

render() {
        return (
            <Link href={{pathname: '/technology', query: {technology: this.props.title}}}>
                <a
                    ref={this.getLessonBlockRef}
                    className='lessonBlock'
                    style={{backgroundColor: this.props.backgroundColor,}}
                >
                    { this.props.title }
                </a>
            </Link>
        );
    }


Но страница "технологии" ака компонент не вызывает getInitialProps:
TechnologyPage.getInitialProps = async ({store, req, query}) => {
    console.log("GET INITIAL PROPS PAGE TECHNOLOGY!");
    try {
        const response = await axios.get(`${req.protocol}://${req.get('Host')}/api/getTechnologySections`, {params: {technology: query.technology}});
        store.dispatch({type: 'getTechnologySections', payload: response.data});
    } catch (error) {
        console.log(error);
    }
};


Но! Если я захожу на страницу "технологии" напрямую через адресную строку (вбиваю туда путь к этой странице), то всё срабатывает. Почему так? Кто может объяснить такое странное поведение?
  • Вопрос задан
  • 434 просмотра
Решения вопроса 1
@Shagfey Автор вопроса
FullStack JS developer
В общем решение такое:

1. Когда первый раз загружаешь приложение, то оно грузится с сервера. И данные по всем урлам берутся с сервера. В дальнейшем всё берётся с клиента.

2. Такой код рабочий:
TechnologyPage.getInitialProps = async ({store, req, query}) => {
    try {
        let response = null;
        if (process.browser) {
            response = await axios.get(`${window.location.protocol}/api/getTechnologySections`, {params: {technology: query.technology}});
        } else {
            response = await axios.get(`${req.protocol}://${req.get('Host')}/api/getTechnologySections`, {params: {technology: query.technology}});
        }
        store.dispatch({type: 'getTechnologySections', payload: response.data});
    } catch (error) {
        console.log(error);
    }
};

Так надо делать в каждом компоненте.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы