[英]React + Typescript: Type of React component with no state/no props
我見過多個使用 Typescript 的 React 組件示例:
class Foo extends React.Component<IProps, IState> {}
當我們不使用 Props 或 State 時,似乎沒有明確的約定。
人們將這些類型設置為any
、 null
、 undefined
、 {}
、 等。這是我目前所看到的:void
class Foo extends React.Component<null, null> {}
class Foo extends React.Component<any, any> {}
class Foo extends React.Component<{}, {}> {}
class Foo extends React.Component<undefined, undefined> {}
class Foo extends React.Component<void, void> {}
class Foo extends React.Component<object, object> {}
最好的方法是什么?
更新:
道具:
void
( https://github.com/Microsoft/TypeScript/issues/15409和https://github.com/Microsoft/TypeScript/issues/15419 ),因為 props 對象被初始化為{}
解決方案
簡單地做 - class Foo extends React.Component {}
作為 prop 和 state 被初始化為{}
interface Component<P = {}, S = {}> extends ComponentLifecycle<P, S> { }
props 和 state 被初始化為{}
,所以對於沒有 state 和 prop 的組件,我們可以簡單地做:
class Foo extends React.Component {}
根據本指南和我的經驗,我會說:
class Foo extends React.Component<null, null> {}
當你知道你不會收到 props 或 state 時class Foo extends React.Component<any, any> {}
當你知道你會收到 props 和 state 但你真的不關心它們的樣子class Foo extends React.Component<{}, {}> {}
見過,看起來很奇怪class Foo extends React.Component<undefined, undefined> {}
與null
相同,這取決於您。 我經常看到null
不是undefined
class Foo extends React.Component<void, void> {}
壞主意,因為它似乎是為函數返回保留的(當你不期望的時候)歡迎其他意見
對於這個問題的回答,您可以使用React.FC<{}>
類
const MyStatelessComponent : React.FC<{}> = props =>
<div>{props.children}</div>
或者,如果您的標記變大:
const MyStatelessComponent : React.FC<{}> = props => {
{/* Some code here */}
return <div>{props.children}</div>
}
我總是為每個組件創建一個 props 接口,即使它是空白的。 它使事情保持一致,並允許我稍后在需要時輕松添加道具。
Interface FooProps { }
class foo extends React.Component<FooProps, any> {
}
您可以將VoidFunctionComponent
用於無狀態和無道具組件(沒有狀態和道具):
const MyComponent: React.VoidFunctionComponent = () => {
...
}
有狀態(基於類的組件)和無狀態組件在互聯網上有很多關於何時使用一種或另一種的概念,我已經使用這個列表掌握了這些概念(在有實踐經驗之前):
無國籍
示例:菜單、用戶信息、列表、邊欄。
有狀態的
示例:UserPage、FollowersSidebar、ArticlesContainer。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.