如何使用react router 4配置专用路由

时间:2018-03-17 02:27:55

标签: javascript reactjs react-router-v4

我有私有路径组件的以下代码。

import React from 'react';
import {Route, Redirect} from 'react-router-dom';
import {connect} from 'react-redux';

class PrivaetRoute extends React.Component {

    render() {
        const {component: Component, ...rest} = this.props;

        return (
            <Route
                {...rest}
                render={props => this.props.loggedIn ? (
                    <Component {...props}/>
                ) : (
                    <Redirect
                        to={{
                            pathname: '/',
                            state: {from: this.props.location},
                        }}
                    />
                )}
            />
        )
    }
}

function mapStateToProps(state) {
    return {
        loggedIn: state.loggedIn
    }
}

export default connect(mapStateToProps)(PrivaetRoute);

我为应用程序组件提供了以下代码,用于呈现不同的路径

import React from 'react';
import {BrowserRouter, Route, Switch} from 'react-router-dom';
import Reboot from 'material-ui/Reboot';

/**
 * Local
 * */

import IndexPage from '../pages/Index';
import DashboardPage from '../pages/Dashboard';
import PrivateRoute from '../containers/PrivateRoutes';

export default class App extends React.Component {

    render() {
        return (
            <div>
                <BrowserRouter>
                    <div>
                        <Reboot/>
                        <Switch>
                            <Route exact path="/" component={IndexPage}/>
                            <PrivateRoute path="/dashboard" component={DashboardPage}/>
                        </Switch>
                    </div>
                </BrowserRouter>
            </div>
        );
    }
}

我如何设计登录系统是我的redux操作在身份验证完成时将loggedIn状态更改为true。我已使用Chrome开发人员工具检查loggedIn状态确实设置为loggedIn:true;但是,当我将网址更改为/dashboard时,所有状态都会刷新(甚至是redux状态),然后我会重定向到/。我做错了什么?

**编辑redux容器

import React from 'react';
import ReactDOM from 'react-dom';
import {Provider} from 'react-redux';
import {createStore, applyMiddleware} from 'redux';
import reduxThunk from 'redux-thunk';
import {composeWithDevTools} from 'redux-devtools-extension';

import App from './components/App';
import reducers from './reducers';

const store = createStore(reducers, {}, composeWithDevTools(applyMiddleware(reduxThunk)));

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.querySelector('#root')
);

2 个答案:

答案 0 :(得分:0)

您应该使用Redux

您可以阅读here

为什么要使用Redux?

因为Redux充当全局状态容器,这意味着无论你去哪个页面,状态都不会被重置。

如何正确使用Redux和React-Router?

记住一件事,Redux应该是React-Router的父母 所以看起来应该是这样的

<Provider>
    <Router>
        <YourApp/>
    </Router>
</Provider>

仅供参考:Provider是Redux的状态容器。

如果您将<Router>作为<Provider>的父级,则您将再次面临同样的问题。

希望它有所帮助。

答案 1 :(得分:0)

与路线设置完全没有关系。

我正在使用combineReducers函数,我没有意识到它将所有状态包装到父对象中,因此在访问我想要访问的实际对象之前,我必须访问它的密钥。