【发布时间】:2018-12-02 14:05:58
【问题描述】:
在我的 React JS 项目中,我正在处理 PrivateRoutes。
我已经使用react-router-dom 完成了这个私有路由和身份验证的示例。
https://reacttraining.com/react-router/web/example/auth-workflow
根据本文档,他们创建了一个PrivateRoute 作为无状态组件。
但我的要求是将其转换为有状态的 React 组件,因为我想将我的 PrivateRoute 组件连接到 redux 存储。
这是我的代码。
无状态组件
import React from 'react';
import {Route, Redirect} from 'react-router-dom';
import {auth} from './Authentication';
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={props =>
auth.isAuthenticated ? (
<Component {...props} />
) : (
<Component {...props} action="login"/>
)
}
/>
);
export default PrivateRoute;
我像这样将此组件转换为有状态的React 组件。
有状态的 React 组件
import React from 'react';
import {Route, Redirect} from 'react-router-dom';
import {auth} from './Authentication';
import {connect} from 'react-redux';
class PrivateRoute extends React.Component {
render({ component: Component, ...rest }) {
return (
<Route
{...rest}
render={props =>
this.props.customer.isAuthenticated ? (
<Component {...props} />
) : (
<Component {...props} action="login"/>
)
}
/>
);
}
}
export default connect(state => state)(PrivateRoute);
这里,我正在从 redux 存储中读取数据以检查用户是否经过身份验证。
但是我将无状态组件转换为有状态的方式是不正确的。
我是否正确传递了参数render({ component: Component, ...rest })?
将PrivateRoute 与redux 存储连接会产生props 的任何问题,因为state=>state 将state 映射到props 以及...rest 将具有props 对象?
不确定代码内部发生了什么。
更新 AppRouter.js
import React from 'react';
import {BrowserRouter, Route, Switch} from 'react-router-dom';
import {TransitionGroup, CSSTransition} from 'react-transition-group';
import PrivateRoute from './PrivateRoute';
import HomePage from './../components/HomePage';
import AboutUs from './../components/AboutUs';
import ContactUs from './../components/ContactUs';
import PageNotFound from './../components/PageNotFound';
import RestaurantList from '../components/RestaurantList';
import RestaurantMenu from '../components/RestaurantMenu';
import UserDetails from '../components/UserDetails';
import OrderConfirmation from '../components/OrderConfirmation';
import CustomerAccount from '../components/CustomerAccount';
import Logout from '../components/sections/Logout';
export default () => {
return (
<BrowserRouter>
<Route render={({location}) => (
<TransitionGroup>
<CSSTransition key={location.key} timeout={300} classNames="fade">
<Switch location={location}>
<Route path="/" component={HomePage} exact={true}/>
<Route path="/about" component={AboutUs} />
<Route path="/contact" component={ContactUs} />
<Route path="/restaurants" component={RestaurantList} />
<Route path="/select-menu" component={RestaurantMenu} />
<PrivateRoute path="/user-details" component={UserDetails} />
<PrivateRoute path="/order-confirmation" component={OrderConfirmation} />
<PrivateRoute path="/my-account" component={CustomerAccount} />
<PrivateRoute path="/logout" component={Logout} />
<Route component={PageNotFound} />
</Switch>
</CSSTransition>
</TransitionGroup>
)} />
</BrowserRouter>
);
}
【问题讨论】:
-
如果您将所有必需的数据传递给
props,那么尽管没有state,为什么还要将其转换为有状态组件? -
我想把这个组件连接到redux store,我确实连接了它,但是
this.props.customer.isAuthenticated对我来说是不可用的,所以我想我应该把它转换成一个有状态的组件。
标签: javascript reactjs react-router react-redux