代码之家  ›  专栏  ›  技术社区  ›  forJ

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

  •  0
  • forJ  · 技术社区  · 7 年前

    我有以下专用路由组件代码。

    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 ;但是,当我将url更改为 /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 回复  |  直到 7 年前
        1
  •  0
  •   Wong Jia Hau    7 年前

    您应该使用Redux

    你可以读到它 here

    为什么要使用Redux?

    由于Redux充当全局状态容器,这意味着无论您访问哪个页面,状态都不会重置。

    如何正确使用React路由器的Redux?

    请记住一件事,Redux应该是React路由器的父级。
    所以应该是这样的

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

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

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

    希望有帮助。

        2
  •  0
  •   forJ    7 年前

    这与路线设置无关。

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