javascript - 无法将正确的组件作为道具传递给自定义路由器
问题描述
我正在尝试创建一个<ProtectedRoute />
组件,我可以在其中传递一个如下所示的组件
<Route exact={true} path={routes.LOGIN} component={Login} />
<ProtectedRoute path={routes.HOME} component={Home} authUser={this.state.authUser} />
<ProtectedRoute path={routes.PROJECT} component={Project} authUser={this.state.authUser} />
我的 ProtectedRoute.tsx 代码
interface ProtectedRouteProps {
path: string;
component: React.ElementType;
authUser: any;
}
export class ProtectedRoute extends React.Component<ProtectedRouteProps, {}> {
constructor(props: any) {
super(props);
}
render() {
const Component = this.props.component;
const authUser = this.props.authUser;
console.log(this.props.component);
return authUser ? (
<Component />
) : (
<Redirect to={{ pathname: routes.LOGIN }} />
);
}
}
在我尝试过的道具中React.Component
,React.ComponentType<any>
也是。
但是,我的应用程序从不路由到Project
,它总是路由到Home
.
所以,我添加了一个日志来看看我得到了什么this.props.component
。
我总是得到
class Home extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {
constructor(props) {
super(props);
}
render() {
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.c…
这让我觉得我没有正确传递组件。
任何人都可以帮助解决错误或如何使用道具传递组件。PS:如果我添加Project
而Route
不是ProtectedRoute
,它工作正常。
编辑:添加主页/项目组件(它们都具有相同的形式)。
export class Project extends React.Component {
constructor(props: any) {
super(props);
}
render() {
return (
<div>
<h1>Project</h1>
</div>
)
}
}
解决方案
您需要发送组件
<Route exact={true} path={routes.LOGIN} component={Login} />
<ProtectedRoute path={routes.HOME} component={()=>(<Home/>)} authUser={this.state.authUser} />
<ProtectedRoute path={routes.PROJECT} component={()=>(<Project/>)} authUser={this.state.authUser} />
和 ProtectedRoute
interface ProtectedRouteProps {
path: string;
component: React.ElementType;
authUser: any;
}
export class ProtectedRoute extends React.Component<ProtectedRouteProps, {}> {
constructor(props: any) {
super(props);
}
render() {
const authUser = this.props.authUser;
console.log(this.props.component);
return authUser ? (
this.props.component()
) : (
<Redirect to={{ pathname: routes.LOGIN }} />
);
}
}
推荐阅读
- python - 使用python获取不同语言的单词列表
- csv - 使用批处理文件替换 csv 文件中的 (C*)
- c# - 为什么单击第三方加载项按钮时我的文档级加载项会关闭?
- excel - 源代码属性 VB_VarMemberFlags 在 VBA 中做了什么(如果有的话)?
- python - Django 接受一个整数到 CharField
- ruby-on-rails - 如何覆盖docker忽略?
- python - 根据条件选择变量
- apache-nifi - S2S 出处 - 目的地惩罚
- spring - 使用休眠和弹簧数据 jpa 映射数字(10)的 varray
- html - HTML5 Viewport 元标记在纵向模式下无法在 Android 手机上运行