当前位置: 首页 > 知识库问答 >
问题:

何时使用JSX.Element与ReactNode与ReactElement?

齐琦
2023-03-14

我目前正在将React应用程序迁移到Typescript。到目前为止,它工作得很好,但是我的render函数的返回类型(分别是函数组件)有一个问题。

到目前为止,我一直使用jsx.element作为返回类型,现在如果组件决定不呈现任何内容,也就是返回null,这就不再起作用了,因为null不是jsx.element的有效值。这是我旅程的开始,因为现在我搜索了web并发现应该使用reactnode,其中还包括null以及其他一些可能发生的事情。这似乎是更好的赌注。

  1. jsx.elementreactnodereactelement有什么区别?
  2. 为什么类组件的render方法返回reactnode,而函数组件返回reactelement
  3. 如何解决null

共有1个答案

柴良哲
2023-03-14

Element、ReactNode和ReactElement之间有什么区别?

ReactElement是具有类型和道具的对象。

 type Key = string | number

 interface ReactElement<P = any, T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>> {
    type: T;
    props: P;
    key: Key | null;
}

ReactNode是ReactElement、ReactFragment、string、number或ReactNodes的数组,或者null、undefined或者boolean:

type ReactText = string | number;
type ReactChild = ReactElement | ReactText;

interface ReactNodeArray extends Array<ReactNode> {}
type ReactFragment = {} | ReactNodeArray;

type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;
declare global {
  namespace JSX {
    interface Element extends React.ReactElement<any, any> { }
  }
}

举例说明:

 <p> // <- ReactElement = JSX.Element
   <Custom> // <- ReactElement = JSX.Element
     {true && "test"} // <- ReactNode
  </Custom>
 </p>

为什么类组件的呈现方法返回ReactNode,而函数组件返回ReactElement?

事实上,他们确实返回了不同的东西。组件返回:

 render(): ReactNode;
 interface StatelessComponent<P = {}> {
    (props: P & { children?: ReactNode }, context?: any): ReactElement | null;
    // ... doesn't matter
}

类型源

 类似资料:
  • 问题内容: 我目前正在将React应用程序迁移到TypeScript。到目前为止,这很好,但是我分别对函数的返回类型和函数组件有问题。 到目前为止,我一直用作返回类型,现在如果组件决定 不 呈现任何内容(即return),则此方法将不再起作用,因为没有有效的值。这是我旅程的开始,因为现在我在网上搜索并发现您应该使用它,它还包括可能发生的其他一些事情。这似乎是更好的选择。 但是,现在在创建功能组件时

  • 我不是在问这里已经问过的问题:@PathParam和@QueryParam之间有什么区别 这是一个“最佳做法”或惯例问题。 何时使用和。 我能想到的是,这个决定可能是利用这两者来区分信息模式。让我在下面举例说明我的LTPO-不够完美的观察。 PathParam的使用可以保留给information category,它很好地属于information Tree的一个分支。PathParam可用于向

  • 我一直在研究如何将Spring与REST结合使用的各种示例。我们的最终目标是Spring设置 我已经看到了两种不同的方法,用于在Spring中渲染REST > 在控制器中通过 通过存储库中的< code > @ RepositoryRestResource 我正在努力寻找的是,为什么你会使用一个而不是另一个。当尝试实施时,哪一个是最好的? 我们的数据库后端是Neo4j。

  • 我想了解更多这句话发现Grails留档: 如果测试涉及证明测试对象以特定方式与合作者交互,则使用模拟。如果协作者以某种方式的行为暴露了测试主题中的特定行为,那么该行为的结果就是您正在测试的,请使用存根

  • 问题内容: 除了a 和Java 可以两次包含相同的元素外,a 和Java 之间在实践上还有什么区别吗?它们具有相同的方法。 (例如,是否给我更多选择来使用接受s但不接受s的库?) 编辑: 我可以认为至少有5种不同的情况来判断这个问题。其他人还能提出更多建议吗?我想确保我了解这里的微妙之处。 设计接受或参数的方法。更通用,并接受更多输入可能性。(如果我正在设计特定的类或接口,那么对我的消费者会更好,

  • 问题内容: 我正在阅读各种IPC机制。我试图弄清楚使用共享内存和使用命名管道(FIFO)的方案。 管道:可以写入多个进程,但是只能读取一个进程。写操作是原子的。 共享内存:可以读写多个进程。用户还需要提供读写互斥功能。 这是共享内存和管道应用程序的唯一区别吗? 问题答案: 本质上,管道(无论是命名管道还是匿名管道)都像消息传递一样使用。有人将一条信息发送给收件人,收件人可以接收它。共享内存更像是发