在一个基于类的组件中,我可以很容易地写一些这样的代码:
import * as React from 'react';
import { render } from 'react-dom';
interface IProps<T> {
collapsed: boolean;
listOfData: T[];
displayData: (data: T, index: number) => React.ReactNode;
}
class CollapsableDataList<T> extends React.Component<IProps<T>> {
render () {
if (!this.props.collapsed) {
return <span>total: {this.props.listOfData.length}</span>
} else {
return (
<>
{
this.props.listOfData.map(this.props.displayData)
}
</>
)
}
}
}
render(
<CollapsableDataList
collapsed={false}
listOfData={[{a: 1, b: 2}, {a: 3, b: 4}]}
displayData={(data, index) => (<span key={index}>{data.a + data.b}</span>)}
/>,
document.getElementById('root'),
)
实际上这个CollapsableDataList
组件应该是一个函数组件,因为它是无状态的,但是我不知道如何编写一个函数组件并在props中使用泛型,有什么建议吗?
8条答案
按热度按时间uurv41yg1#
你不能创建一个带有类型注解的函数组件,并使其成为泛型。所以这将不起作用,因为
T
没有定义,你不能在变量级别上定义它:但是,您可以跳过类型注解,使函数成为泛型并显式输入
props
。4c8rllxm2#
类型
React.FC
基本上是这样的:因此,而不是这样(这是不允许的):
你可以使用这个:
例如:
或者,更严格地说,如果组件没有使用
children
属性,也不会返回null
:然后使用类型化组件作为
<Example<string> value="foo"/>
k4aesqcs3#
e5njpo684#
在处理功能组件之前,我假设原始代码示例缺少JSX组件中的泛型,因为我没有看到它传递到
IProps
接口。即:好了,现在你可以用一个通用的 prop 来创建一个功能组件。
你会被“现代”语法卡住,因为它使用了一个赋值和箭头函数,这对你的通用情况毫无用处:
让我们将变量赋值重写为一个很好的旧
function
:如果组件不使用children属性,则不一定需要
children
解决方案,但我添加它是为了强调必须手动重新输入的事实,就像React.FC
之前为我们做的那样。tnkciper5#
React 18,Typescript 4.6.3
sy5wg1nm6#
补充#1。
如果要将组件导出为FunctionComponent并传递eslint displayName错误。
你可以做它波纹管。
w6mmgewl7#
This answer是一个很好的例子,因为它正确地定义了props和函数的返回类型。
作为替代方案,这些可以被定义为函数而不是箭头函数。这避免了扩展prop类型以提示TS编译器这不是一个react组件的需要。
oxf4rvwz8#
我使用React Native创建了一个简单的自定义按钮组件,展示了在React Functional Component中使用泛型和props的场景。
让我们通过设置一个类型来调用自定义按钮组件,该类型将有条件地只接受与特定类型相关的属性,否则将显示类型错误。