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; };
 
 
  |