reactjs - 向 StatelessComponent 添加属性
问题描述
如何为无状态组件添加属性?
例如,PrivateRoute 是一个无状态组件,用于在用户未通过身份验证时禁止导航到某些路由。路由通过路由器访问:
import { BrowserRouter as Router, Link, Route, Redirect } from 'react-router-dom';
...
<Router basename={baseUrl} >
<div>
<ul>
<li><Link to='/public'>Public</Link></li>
<li><Link to='/protected'>Protected</Link></li>
</ul>
<PrivateRoute path='/protected' component={Protected} auth={true}/>
</div>
</Router>
我的目标是通过 auth={true} (这最终将成为基于登录页面更新的标志),但是,我收到以下错误:
Severity Code Description Project File Line Suppression State
Error TS2339 (TS) Property 'auth' does not exist on type 'IntrinsicAttributes & RouteProps & { children?: ReactNode; }'.
PrivateRoute 定义如下:
import * as React from "react"
import { Redirect, Route, RouteComponentProps, RouteProps } from "react-router-dom"
type RouteComponent = React.StatelessComponent<RouteComponentProps<{}>> | React.ComponentClass<any>
const AUTHENTICATED = true;
export const PrivateRoute: React.StatelessComponent<RouteProps> = ({ component, ...rest }: any) => {
const renderFn = (Component?: RouteComponent) => (props: RouteProps) => {
if (!Component) { return null }
console.log(props)
if (AUTHENTICATED) { return <Component {...props} /> }
const redirectProps = {
to: {
pathname: "/login",
state: { from: props.location },
},
}
return <Redirect {...redirectProps} />
}
return <Route {...rest} render={renderFn(component)} />
}
我努力了:
export const PrivateRoute: React.StatelessComponent<RouteProps> = ({ component, auth, ...rest }: any) => {
const renderFn = (Component?: RouteComponent) => (props: RouteProps) => {
也
export const PrivateRoute: React.StatelessComponent<RouteProps> = ({ component, ...rest }: any, auth: boolean) => {
const renderFn = (Component?: RouteComponent) => (props: RouteProps) => {
和
export const PrivateRoute: React.StatelessComponent<RouteProps> = ({ component, ...rest }: any) => {
const renderFn = (Component?: RouteComponent, auth: boolean) => (props: RouteProps) => {
最后,我尝试通过变量发送值:
let authenticated = false
<PrivateRoute path='/protected' component={Protected} {...authenticated}/>
这样做时,我无法在 props、rest 或 Component 中找到它。
解决方案
这是一个打字稿错误,而不是反应错误。假设这auth
是您的自定义属性,您需要执行以下操作才能使其正常工作:
interface PrivateRouteProps extends RouteProps {
auth?: boolean;
}
export const PrivateRoute: React.StatelessComponent<PrivateRouteProps> = ({component, auth, ...rest})
做事SFC<RouteProps & { auth?: boolean }>
也应该奏效。关键是你不能在 React TSX 中添加道具而不声明props
是any
或声明附加道具的类型。我不相信有办法完全tsconfig.json
跳过这张支票,但可能有办法。
推荐阅读
- jquery - 获取 contentEditable div 的第一行
- php - php 线程在 cmd 中正确运行,但不在浏览器中运行。并给出“致命错误:在第 2 行的 C:\xampp\htdocs\test.php 中找不到类 'Thread'”错误
- javascript - 将程序 php 转移到 laravel php
- visual-studio-code - 通过Mac终端打开2个Visual Studio Code窗口
- apache - apache - htaccess if/else 与文件夹?
- r - caret::groupKFold 和验证/测试
- java - Java mkdir() 文件夹,您无法在其中创建子文件夹或文件(拒绝访问)
- jenkins - 使用参数安排 Jenkins 构建
- sap - HANA - 使用其他行的数据进行计算
- powermock - PowerMockito.whenNew 正在使用参考而不是使用对象