реагировать на отдельные маршруты для вошедшего в систему и гостевого пользователя

На официальной странице github React-router-component упоминается следующее:

Например, вы можете вернуть другой набор разрешенных местоположений для анонимных и вошедших пользователей.

Это именно то, чего я хочу добиться, но я нигде не могу найти учебник, как это сделать.

Поэтому в основном я хочу иметь отдельные маршрутизаторы для вошедшего в систему пользователя и гостевого пользователя. Гостевой маршрутизатор по умолчанию использует страницу входа в систему и может перенаправить на страницу ошибки входа или страницу сведений. Когда пользователь успешно вошел в систему, вошедший в систему маршрутизатор берет на себя управление и по умолчанию переходит на страницу обзора системы. Зарегистрированные маршруты также должны отображать панель навигации на каждой странице.


person Tuomas Toivonen    schedule 23.06.2016    source источник
comment
Вопросы, в которых нас просят рекомендовать или найти книгу, инструмент, программную библиотеку, учебное пособие или другой ресурс за пределами сайта, не относятся к теме Stack Overflow, поскольку они, как правило, привлекают самоуверенные ответы и спам. Вместо этого опишите проблему и то, что уже было сделано для ее решения. Это.   -  person Gustavo Morales    schedule 23.06.2016
comment
Возможный дубликат React Router Authorization   -  person Ashitaka    schedule 25.06.2016
comment
Посмотрите официальные примеры реактивного маршрутизатора: github.com/reactjs/react-router/blob/   -  person Ashitaka    schedule 25.06.2016


Ответы (2)


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

Вот примеры составного компонента, затем я покажу вам, как использовать его в вашем файле маршрутов.

import React, {Component} from 'react';
import {connect} from 'react-redux';

export default function(ComposedComponent) { //This code right here serves as the base for any high order component 

    class Authentication extends Component {

        static contextTypes = { //static creates a class level object that will give any other method in this component access to Authentication.contextTypes
            router: React.PropTypes.object //This lets react know ahead of time we will use the router and it defines its type as object
        }

        componentWillMount() {
            if (!this.props.authenticated) {
                this.context.router.push('/signup');
            }

        }

        componentWillUpdate(nextProps) {
         //this lifecycle method runs when the component is about to update with new props, nextProps are those new properties for the rerender
            if (!nextProps.authenticated) {
                this.context.router.push('/signup');
            }
        }

        //{...this.props} makes sure the new combined component Enhanced Component will have all the props of the original component passed into this function/Authentication class
        //it maintains those props even though it's combining two components together to form a Enhanced Component
        render() {

            return (
                <ComposedComponent {...this.props} />
            );
        }

    }

    function mapStateToProps(state) {
        return { authenticated: state.user.authenticated };
    }

    return connect(mapStateToProps)(Authentication);
}

Я импортировал компонент аутентификации выше как RequireAuth в файл маршрутов. Он проверит, аутентифицирован ли пользователь в моем состоянии редукции. Если пользователь не аутентифицирован, он возвращается на мой маршрут «/ signup». Вы можете увидеть, где это происходит в методах жизненного цикла аутентификации. По сути, если я оберну какой-либо компонент в свои маршруты с помощью RequireAuth, эти компоненты наследуют его методы жизненного цикла. Вы можете использовать его не только для проверки, вошли ли они в систему или нет. У вас могут быть определенные пользователи с правами администратора и т. д. Вам просто нужно проверить квалификацию пользователя в методах жизненного цикла и протолкнуть маршрут туда, куда вы хотите.

export default (
    <Route path="/" component={App}>
        <IndexRoute component={Home} />
        <Route path="inventory" component={RequireAuth(Inventory)} />
        <Route path="signup" component={Signup} />
        <Route path="single-product/:id" component={RequireAuth(Product)} />
        <Route path="examples" component={Examples} />
        <Route path="pricing" component={Pricing} />
        <Route path="profile" component={RequireAuth(Profile)} />
        <Route path="allProducts" component={RequireAuth(AllProducts)} />
        <Route path="reporting" component={RequireAuth(ReportingContainer)} />
        <Route path="signout" component={Signout} />

    </Route>
);
person Mjuice    schedule 23.06.2016

После входа/регистрации пользователя вы можете изменить состояние (например, this.setState({isLoggedIn: true}) в своем родительском компоненте (index.js или App.js). Теперь в зависимости от состояния вы можете перенаправить пользователя в нужное место.

<Route path='/dashboard' 
       render={() => 
          this.state.isLoggedIn ? 
             <Dashboard user={this.state.user} /> : 
             <Redirect to="/home"/> 
       }
/>

Весь код можно увидеть здесь: ссылка. Тем не менее, если есть сомнения, спросите в разделе комментариев.

person Pransh Tiwari    schedule 19.06.2018