1.) JSX 有什么区别。Element, ReactNode and ReactElement?
ReactElement 和 JSX.Element是直接或通过JSX转译调用React.createElement
的结果。它是一个带有 、 和 的对象。新浪网.元素
是 ,其 和 具有类型,因此它们或多或少是相同的。type
props
key
ReactElement
props
type
any
const jsx = <div>hello</div>
const ele = React.createElement("div", null, "hello");
ReactNode 被用作类组件的返回类型。它也是 PropsWithChildren
属性的默认类型。render()
children
const Comp: FunctionComponent = props => <div>{props.children}</div>
// children?: React.ReactNode
它在 React 类型声明中看起来更复杂,但等效于:
type ReactNode = {} | null | undefined;
// super type `{}` has absorbed *all* other types, which are sub types of `{}`
// so it is a very "broad" type (I don't want to say useless...)
您可以将几乎所有内容分配给 。我通常更喜欢更强的类型,但可能有一些有效的案例来使用它。ReactNode
2.) 为什么类组件的渲染方法返回 ReactNode,而函数组件返回 ReactElement?
tl;dr:它是当前 TS 类型的不兼容性,与核心 React 无关。
原则上,在 React/JS 类中,组件支持与函数组件相同的返回类型。关于 TS,由于历史原因和对向后兼容性的需求,不同的类型仍然保持不一致。render()
理想情况下,有效的返回类型可能看起来更像这样:
type ComponentReturnType = ReactElement | Array<ComponentReturnType> | string | number
| boolean | null // Note: undefined is invalid
3.) 我如何解决与空值相关的问题?
一些选项:
// Use type inference; inferred return type is `JSX.Element | null`
const MyComp1 = ({ condition }: { condition: boolean }) =>
condition ? <div>Hello</div> : null
// Use explicit function return types; Add `null`, if needed
const MyComp2 = (): JSX.Element => <div>Hello</div>;
const MyComp3 = (): React.ReactElement => <div>Hello</div>;
// Option 3 is equivalent to 2 + we don't need to use a global (JSX namespace)
// Use built-in `FunctionComponent` or `FC` type
const MyComp4: React.FC<MyProps> = () => <div>Hello</div>;
注意:避免不会将您从返回类型限制中拯救出来。React.FC
JSX.Element | null
Create React App最近从其模板中删除了React.FC
,因为它有一些怪癖,比如隐式{children?:ReactNode}
类型定义。因此,谨慎使用可能更可取。React.FC
在边缘情况下,您可以添加类型断言或片段作为解决方法:
const MyCompFragment: FunctionComponent = () => <>"Hello"</>
const MyCompCast: FunctionComponent = () => "Hello" as any
// alternative to `as any`: `as unknown as JSX.Element | null`