React Router работает только несколько раз

В настоящее время я экспериментирую с использованием React Router на создаваемом мной веб-сайте. Я столкнулся с использованием React Router для навигации по моему веб-сайту, а также для других вещей, таких как чтение значений параметров и т. Д. Однако я нахожу это немного запутанным. Видите ли, на моей странице входа администратора маршрутизатор работает только несколько раз, но я действительно не понял, когда и когда нет. Я использую this.props.history.push ('/ admin / dashboard'), и считаю, что это правильный способ сделать это. В настоящее время это моя установка в index.js, где у меня есть все мои маршруты:

import React from 'react';
import ReactDOM from 'react-dom';
import registerServiceWorker from './registerServiceWorker';
import './css-styling/styling.css'
import Frontpage from './Frontpage';
import { BrowserRouter, Route, Router, Switch, Link, NavLink } from 'react-router-dom';
import AdminLogin from './Admin-Login';
import AdminWelcome from './Admin-Welcome';
import Authentication from './components/Authentication';

const websiteRoutes = (
    <Router history={history}>
        <div>
            <Switch>
                <Route path="/" component={Frontpage} exact={true}/>
                <Route path="/admin" component={AdminLogin} exact={true}/>
                <Authentication props={this.props}>
                <Route path="/admin/welcome" component={AdminWelcome} exact={true}/>
                </Authentication>
            </Switch>
        </div>
    </Router>
);

var appRoot = document.getElementById('root');
registerServiceWorker();
ReactDOM.render(websiteRoutes, appRoot);

И каждый «компонент» имеет такую ​​структуру:

import React from 'react';
import ReactDOM from 'react-dom';
import AdminHeader from './components/Admin-Header';
import AdminPanelLogin from './components/Admin-Panel-Add-News';
import history from './components/History';

class AdminLogin extends React.Component{

    render() {
        return(
            <div>
            <AdminHeader />
            <AdminPanelLogin />
            </div>
        );
    }

}

export default AdminLogin;

В чем, кажется, проблема? Я пробовал много разных решений, но безуспешно. Один из них создавал эту «глобальную историю», которую, как вы можете видеть, я импортировал в свой класс AdminAddNews.

Как правильно использовать React Router в моем случае?

Кстати; History.push происходит внутри моего компонента AdminPanelLogin, где код выглядит следующим образом:

import React from 'react';
import ReactDOM from 'react-dom';
import { Icon, Input, Button, Message } from 'semantic-ui-react';
import {auth} from './Firebase';
import {NotificationContainer, NotificationManager} from 'react-notifications';
import { withRouter, Redirect } from 'react-router-dom';
import history from './components/History';


class AdminLogin extends React.Component{

constructor(props){
    super(props);

    this.handleLogin = this.handleLogin.bind(this);
    this.clickLogin = this.clickLogin.bind(this);
    this.performLogin = this.performLogin.bind(this);
}


handleLogin(e){
    this.setState({
        [e.target.name]: e.target.value
    });
}


clickLogin(e){
    e.preventDefault();
    auth.signInWithEmailAndPassword(this.state.email, this.state.password).then(() => {
        this.props.history.push('/admin/dashboard');
    }).catch((error)=> {

    })
}

    render() {
        return (
            <HTMLGOESHERE>
        );
    }
}

export default AdminLogin;

person askaale    schedule 14.02.2018    source источник
comment
Возможный дубликат программно-навигации-с использованием-реагирования-маршрутизатора   -  person Shubham Khatri    schedule 14.02.2018
comment
пожалуйста, проверьте повторяющийся вопрос, и я уверен, что вы поймете, что не так   -  person Shubham Khatri    schedule 14.02.2018
comment
@ShubhamKhatri Значит, мне нужно использовать withRouter () для каждого отдельного компонента на моем веб-сайте?   -  person askaale    schedule 14.02.2018
comment
Я полагаю, что в ответе четко объяснено, когда вам нужно использовать withRouter, но просто чтобы упомянуть факт, вам нужно использовать withRouter только тогда, когда компонент, из которого вы пытаетесь выполнить навигацию, не получает реквизиты маршрутизатора   -  person Shubham Khatri    schedule 14.02.2018
comment
@ShubhamKhatri Понятно, спасибо. Есть ли какой-то конкретный метод определения этого заранее, вместо того, чтобы вручную проверять с помощью console.log?   -  person askaale    schedule 14.02.2018
comment
Вам нужно проверить свою реализацию, и тогда вы можете быть уверены.   -  person Shubham Khatri    schedule 14.02.2018
comment
Подумайте о том, чтобы проголосовать за ответ, если это помогло   -  person Shubham Khatri    schedule 14.02.2018
comment
@ShubhamKhatri Это все еще не работает, и на всякий случай я экспортировал каждый класс / компонент с помощью withRouter.   -  person askaale    schedule 14.02.2018
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Shubham Khatri    schedule 14.02.2018


Ответы (2)


Несколько вещей, которые вам нужно исправить,

Во-первых: в ваших маршрутах вы прошли history, но нигде не создавали собственную историю. На данный момент вы можете просто использовать BrowserRouter.

Во-вторых: запишите компонент аутентификации как оболочку для маршрутов вместо использования маршрутов в качестве дочерних для него.

Аутентификация:

const PrivateRoute = (props) => {
    const userKey = Object.keys(window.localStorage)
  .filter(it => it.startsWith('firebase:authUser'))[0];
const user = userKey ? JSON.parse(localStorage.getItem(userKey)) : undefined;
   if (user) {
      return <Route {...props} />
   } else {
      return <Redirect to='/admin'/>
   }
}

export default PrivateRoute;

Теперь ваши маршруты могут быть

import { BrowserRouter as Router, Route, Router, Switch } from 'react-router-dom';

import Authentication from './Authentication';
const websiteRoutes = (
    <Router>
        <div>
            <Switch>
                <Route path="/" component={Frontpage} exact={true}/>
                <Route path="/admin" component={AdminLogin} exact={true}/>
                <Authentication path="/admin/welcome" component={AdminWelcome} exact={true}/>
            </Switch>
        </div>
    </Router>
);

Помимо этого проверьте, как Programmatically Navigate with react-router

person Shubham Khatri    schedule 14.02.2018
comment
Это полностью решило мою проблему. В конце концов, это была проблема с моей аутентификацией. Еще раз спасибо, вы избавили меня от головной боли. +1! - person askaale; 14.02.2018

На самом деле вам нужно использовать browserHistory, который является функцией react-router. Надеюсь, следующий фрагмент вам поможет,

Импортируйте react-router в свой index.js

import {Router, Route, browserHistory} from 'react-router';

ReactDOM.render(
  <Router history={browserHistory} >
    <Route path="/admin/somethingZero" component={somethingZero} />
    <Route path="/admin/somethingOne" component={somethingOne}/>
  </Router> , document.getElementById("root")
)

вы можете перемещаться между компонентами, используя функцию browserHistory.push

clickLogin(){
    browserHistory.push('/admin/dashboard')
  }

Также продолжайте это руководство, оно поможет лучше понять маршрутизаторы.

person Thananjaya S    schedule 14.02.2018