基于类的组件中,我可以轻松编写如下代码:
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 中使用泛型,有什么建议吗?
CollapsableDataList
您无法使用类型注释创建函数组件并使其成为通用组件。因此,这将不起作用,因为T未定义,并且您无法在变量级别定义它:
T
const CollapsableDataList : React.FunctionComponent<IProps<T>> = p => { /*...*/ }
但是,您可以跳过类型注释,并使函数具有通用性并props明确输入类型。
props
import * as React from 'react'; import { render } from 'react-dom'; interface IProps<T> { collapsed: boolean; listOfData: T[]; displayData: (data: T, index: number) => React.ReactNode; } const CollapsableDataList = <T extends object>(props: IProps<T> & { children?: ReactNode }) => { if (!props.collapsed) { return <span>total: {props.listOfData.length}</span> } else { return ( <> { props.listOfData.map(props.displayData) } </> ) } } render( <CollapsableDataList collapsed={false} listOfData={[{a: 1, b: 2}, {a: 3, c: 4}]} displayData={(data, index) => (<span key={index}>{data.a + (data.b || 0)}</span>)} />, document.getElementById('root'), )