react读源码系列之JSX到javaScript
Opened this issue · 0 comments
定义
熟悉react的同学可能对JSX这种写作格式已经不陌生了,JSX即JavaScript XML。一种在React组件内部构建标签的类XML语法。
从代码角度分析
const comp = <div id="id" data="123">
<h1>H1</h1>
<h2>H2</h2>
</div>
上面的代码是我们在 react项目中经常会书写的一种方式,那么我们有没有想过为什么react当中可以支持这种写法?这种方式的代码最后又会转换成什么样的格式呢?
下面我们看一下babel转换之后的格式
"use strict";
React.createElement(
"div",
{ id: "id", data: "123" },
React.createElement(
"h1",
null,
"H1"
),
React.createElement(
"h2",
null,
"H2"
)
);
上面编译之后的代码,我们会发现react当中这种JSX格式的代码最终都会通过React.createElement这个方法生成一个一个的“产物”,这里我们先命名为“产物”,后面章节我们再来阐述这生成的产物到底是什么。
我们来看下createElement这个API的参数吧!!!
第一个参数我们可以看到一个字符串 "div" 这不就是我们的html中的标签吗!
在来看下第二个参数,{ id: "id", data: "123" }
一个属性对象,这个就是我们刚刚定义在div上面的属性
第3个参数,又是一个React.createElement生成的“产物”,我们发现里面的内容就是<h1>H1</h1>
这个代码片
.......
从上面的分析,我们可以看到JSX编译成javaScript中, React.createElement的第三个参数之后,都是他的子标签, React.createElement会把第三个参数之后的参数变成一个数组作为它的Children处理。
在来看一下下面的代码块
function Comp() {
return <div id="id" data="123">
<h1>H1</h1>
<h2>H2</h2>
</div>
}
<Comp>
<div>789</div>
</Comp>
第一个例子,我们转换的是html标签,我们在看下组件又是怎么转换的呢?
"use strict";
function Comp() {
return React.createElement(
"div",
{ id: "id", data: "123" },
React.createElement(
"h1",
null,
"H1"
),
React.createElement(
"h2",
null,
"H2"
)
);
}
React.createElement(
Comp,
null,
React.createElement(
"div",
null,
"789"
)
);
这个地方,我们发现第一个参数变成来Comp这个变量了,如果我们把上面的**组件的名称换成小写的再看看编译结果,我们会发现,这个地方就会变成“comp”**字符串了,所以React中我们写组件的时候一定要首字母大写