![](/img/trans.png)
[英]How to use props and navigation together in one functional component in react native
[英]How to use generics in props in React in a functional component?
在基于 class 的组件中,我可以轻松编写如下代码:
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
组件应该是一个功能组件,因为它是无状态的,但我不知道如何编写 function 组件并在道具中使用 generics,对我有什么建议吗?
在基于类的组件中,我可以轻松地编写如下代码:
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中使用泛型,对我有什么建议?
在基于类的组件中,我可以轻松地编写如下代码:
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中使用泛型,对我有什么建议?
在基于类的组件中,我可以轻松地编写如下代码:
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中使用泛型,对我有什么建议?
在基于类的组件中,我可以轻松地编写如下代码:
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中使用泛型,对我有什么建议?
补充 #1。
如果要将组件导出为 FunctionComponent 并传递 eslint displayName 错误。
你可以这样做。
const yourComponentWithLowerCase: <T>(props: PropsWithChildren<Props<T>>) => ReactElement | null = (props) => {
// code
}
export const YourComponentWithUpperCase = yourComponentWithLowerCase;
(YourComponentWithUpperCase as FunctionComponent).displayName = 'something'
这个答案是一个很好的例子,因为它正确定义了函数的 props 和返回类型。
作为替代,这些可以定义为函数而不是箭头函数。 这绕过了扩展 prop 类型以提示 TS 编译器这不是反应组件的需要。
export function CollapsableDataList<T>(
props: PropsWithChildren<IProps<T>>
): ReturnType<FunctionComponent<IProps<T>>> {
// ...
}
反应 18,Typescript 4.6.3
interface IProps<T> {
data: T[];
}
export const YourComponent = <T,>(props: IProps<T>) => {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.