ReactElement
是 React 用来描述 UI 界面元素的最基本的对象,是构建虚拟 DOM 的核心元素。
-
定义
:
ReactElement
是不可变的对象,表示界面中的某个元素。它包含了用于渲染 UI 所需的信息,如元素的类型、属性(props)、以及子元素(children)。
-
类型
:当我们使用 JSX 编写代码时(如
<div>Hello</div>
或
<MyComponent />
),React 会将其转化为
ReactElement
对象。这个对象由 React 内部处理,并最终映射到实际的 DOM 结构。
2. 什么是
children
?
children
是组件属性(props)中的一个特殊属性,用于传递嵌套的子组件或内容。
-
定义
:在 React 组件中,
children
表示组件内嵌的所有子元素。例如,在
<MyComponent><p>Hello</p></MyComponent>
中,
<p>Hello</p>
就是传递给
MyComponent
的
children
。
-
类型
:
children
可以是单个元素,也可以是多个元素,甚至是任意类型的内容,如字符串、数字、
null
或
undefined
。因此,在类型检查时,通常使用
ReactNode
来表示
children
。
3. 什么是
ReactNode
?
ReactNode
是 TypeScript 提供的一个类型,用于表示所有可以被渲染的内容类型。它是 React 中的一个非常灵活的类型。
-
定义
:
ReactNode
是一个联合类型,涵盖了所有可以被渲染的内容。它包括:
-
ReactElement
:通过 JSX 创建的元素。
-
字符串或数字:可以直接显示的文本或数字。
-
布尔值、
null
或
undefined
:不会被渲染,但合法存在。
-
数组:可以包含多个
ReactNode
,用于渲染多个元素。
这种类型的设计使得
ReactNode
可以表示几乎所有的 UI 结构,因此在定义
children
或组件的返回值类型时,
ReactNode
经常被使用。
4. 它们之间的区别
ReactElement
和
ReactNode
的区别
:
-
ReactElement
是 React 用于描述界面元素的具体对象。
-
ReactNode
则是一个更广泛的类型,可以包含
ReactElement
以及其他可渲染的内容,如字符串、数字、数组等。
children
与
ReactNode
的关系
:
-
children
是组件的一个属性,用于接收嵌套的子元素。
-
由于
children
可以是多种类型的内容,通常为其定义的类型是
ReactNode
,这样可以接受多种形式的子内容。
5. 示例分析
为了更好地理解这些概念,让我们看几个示例:
示例 1:
ReactElement
当我们使用 JSX 编写 React 组件时,它们会被转换为
ReactElement
对象。例如:
const element: ReactElement = <h1>Hello, World!</h1>;
这里的
element
是一个
ReactElement
,它描述了一个
h1
元素,包含了 "Hello, World!" 的文本内容。
示例 2:
children
const MyComponent: React.FC = ({ children }) => {
return <div>{children}</div>;
// 使用 MyComponent
<MyComponent>
<p>This is a paragraph.</p>
<span>And this is a span.</span>
</MyComponent>
在上面的代码中,
<p>
和
<span>
元素被作为
children
传递给
MyComponent
。
children
可以包含多个元素,并且它们的类型为
ReactNode
。
示例 3:
ReactNode
const content: ReactNode = "This is a string";
const numberContent: ReactNode = 42;
const elementContent: ReactNode = <h1>Hello</h1>;
const mixedContent: ReactNode = [<h1 key="1">Hello</h1>, <p key="2">World</p>];
这些变量的类型都是
ReactNode
,表示它们都可以被 React 渲染。这展示了
ReactNode
的灵活性,可以表示多种不同的渲染内容。
6. 什么时候使用哪种类型?
-
ReactElement
:当你需要明确表示一个由 JSX 创建的元素时使用。通常不需要手动定义
ReactElement
,因为它是由 JSX 自动生成的。
-
ReactNode
:用于表示可以被渲染的所有类型的内容,特别是在定义组件的
children
或返回值时。
-
children
:作为组件的一个
props
属性,通常定义类型为
ReactNode
,以接受多种形式的嵌套内容。
总结
-
ReactElement
是 React 用来描述 UI 元素的对象,是不可变的。
-
children
是一个特殊的属性,用于传递嵌套的内容到组件内部。
-
ReactNode
是一个通用的类型,可以包含所有可以被渲染的内容,包括
ReactElement
、字符串、数字、数组等。
先判断config中内置props(key,ref,self,source)存在且有效,则赋值给新声明的变量
再将config中非内置的props 给新声明的props(key
和
ref不会跟其他config
中的
变量一起被处理,而是单独作为变量出现在
ReactElement
上。)
判断如果孩子节点为一个
.
.
.
react
ts3 项目
你将会明白:
react
元素的key
和
ref为什么不会存在props上,并且传递,开发环境下与生产环境下处理key
和
ref的区别?
.
.
.
│ ├── hasValidRef ----------------------------- 检测获取config上的ref
.
.
.
React
Children
文章目录
React
Children
escapeescapeUserProvidedKeygetElementKeymapIntoArraymap
Children
children
.
map流程图实例(1)(2)(3)(4)(5)(a)总结
React
Children
提供了许多处理props
.
children
的方法。本文将源码由上往下解析。
escape
function escape(key: string): string {
const escapeRegex = /[=
ReactElement
s 是构成
React
App的最小单位。
React
中的
组件是由一个或多个Elements构成的。
和
DOM不同,
ReactElement
s 是纯粹的
JS
对象。利用
React
生成的DOM会根据
React
elements的数据变化实时更新。
1
.
RE挂载到DOM节点:
1 const element = <h1>Hello, world</h1
.
.
.
interface PreProcessorProps {
error?: boolean | BooleanFunction
loading?: boolean | BooleanFunction
children
:
React
.
ReactNode
| RenderFunction
const PreProcessor:
React
.
FC = ({
children
}) => {
return
children
在使用ts写
React
时,尴尬的遇到了这个错误
不能将类型“({
React
的核心为组件。你可以像嵌套HTML标签一样嵌套使用这些组件,这使得编写
JS
X更加容易因为它类似于标记语言。
当我刚开始学习
React
时,当时我认为“使用 props
.
children
就这么回事,我知道它的一切”。我错了。。
因为我们使用的事JavaScript,我们会改变
children
。我们能够给它们发送特殊的属性,以此来决
.
.
.
type
React
Child =
ReactElement
|
React
Text;
interface
ReactNode
Array extends Array<
ReactNode
> {}
type
React
Fragment = {} |
ReactNode
Array;
type
ReactNode
=
React
Child |
React
Fragment |
React
Portal | boolean | null
.