jsx的本质
| JSX 是 JavaScript 的一种语法扩展,它和模板语言很接近,但是它充分具备 JavaScript 的能力
jsx 如何编译成js
1 2 3 4 5 6 7 8 9
| <div className='test'> <p>123</p> </div>
React.createElement("div", { className: "test" }, React.createElement("p", null, "123"));
|
JSX标签都被转化为了React.createElement的调用,JSX 的本质是React.createElement这个 JavaScript 调用的语法糖
jsx的优点
jsx精简的语法糖,让我们使用类html标签语法来创建虚拟dom(使用js对象语法描述dom元素),降低了学习成本同时提高了工作效率
createElement的作用
开发者通过入参type、config、children调用createElement,创建了一个ReactElement对象,这个对象就是虚拟dom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
const ele = ( <div className="test"> <p>test</p> </div> )
const ele = React.createElement("div", { className: "test" }, React.createElement("p", null, "test"));
{ "type": "div", "key": null, "ref": null, "props": { "className": "test", "children": { "type": "p", "key": null, "ref": null, "props": { "children": "test" }, "_owner": null } }, "_owner": null }
|
问题
1.JSX 的本质是什么,它和 JS 之间到底是什么关系?
本质是js中 React.createElement的语法糖,是一种js语法的拓展。最后通过babel编译成真正的js语法。
2.为什么要用 JSX?不用会有什么后果?
jsx使用类html的方式构造虚拟dom,降低学习成本,提高效率
3.JSX 背后的功能模块是什么,这个功能模块都做了哪些事情?
React.createElement 、ReactElement
通过createElement 将用户参数传入的数据格式化,最后通过ReactElement创建虚拟dom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const ReactElement = function(type, key, ref, self, source, owner, props) { const element = { $$typeof: REACT_ELEMENT_TYPE,
type: type, key: key, ref: ref, props: props,
_owner: owner, };
if (__DEV__) { }
return element; };
|