Machez
@Machez
Бу!

Почему в ReactJS не происходит рендеринг компонента при history.push?

Почему не происходит рендеринг компонента Login после того, как был запушин новый URL /user/login при помощи history.push? А вот при явном запросе URL /user/login - компонент Login рендериться как нужно.

import './../bootstrap'

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { Route, Switch } from 'react-router-dom'
import {withRouter} from "react-router-dom"

import Header from './Header'

import Login from './Login'

import Footer from './Footer'

class App extends Component {

    componentWillMount() {

        if ( ! this.props.auth ) {

            this.props.history.push( '/user/login' )

        }

    }

    render() {

        return (

            <div>
                <Header />
                <Switch>
                    <Route path='/user/login' component={Login}/>
                </Switch>
                <Footer />
            </div>

        )

    }

}

const mapStateToProps = state => {

    return {

        auth: state.auth

    }

}

export default connect( mapStateToProps )( withRouter( App ) )
  • Вопрос задан
  • 2709 просмотров
Решения вопроса 1
Machez
@Machez Автор вопроса
Бу!
Все заработало после того как я поменял экспорт App

Вариант, который был и НЕ работал:
export default connect( mapStateToProps )( withRouter( App ) )


Вариант, который заставил всё работать так, как нужно:
export default withRouter( connect( mapStateToProps )( App ) )


Видимо суть заключается в том, что withRouter это функция высшего порядка и в данном случае ее надо применять уже к результату функции connect.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Я так понимаю, что стейт у вас не обновляется, по сути. Попробуйте сделать специальную обертку, которая будет не только history изменять, но и еще дополнительный state в корневом элементе. Как-то так:

this.setState({ currentUrl: '/user/login' })
Ответ написан
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Как уже сказали, про изменении истории при history.push реакт ничего не знает. Но вы можете научить его реагировать на это (так же как это делает реакт-роутер, по сути) - посмотрите раздел в статье Обучаем Route реагировать на изменение URL-адреса
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы