源码拆解篇请移步https://www.yuque.com/linhe-8mnf5/fxyxkm/xekk7b

1.带着问题去学习JSX

  • JSX本质是什么,它和JS之间到底是什么关系?
  • 为什么要用JSX,不用会带来什么后果?
  • JSX背后的功能模块是什么,这个功能模块的背后到底做了什么?

2.JSX解析

引入React的作用:使用React进行解析jsx,JSX实际上是一个语法糖,它真正是需要解析成js代码来执行

  1. // jsx代码
  2. <div>
  3. <img src="avatar.png" className="profile" />
  4. <h3>{[user.firstName, user.lastName].join(" ")}</h3>
  5. </div>
  6. // 解析结果
  7. React.createElement(
  8. "div",
  9. null,
  10. React.createElement("img", { src: "avatar.png", className: "profile" }),
  11. React.createElement("h3",null,[user.firstName,user.lastName].join(" "))
  12. );

React.createElement参数说明

  1. React.createElement('div',{id:'div1'},child1,child2,child3)
  2. React.createElement('div',{id:'div1'},[...])
  3. // dom 属性 子元素
  1. // jsx代码
  2. class Demo extends Component {
  3. render() {
  4. const list = this.props.data;
  5. return (
  6. <ul>
  7. {list.map((item, index) => {
  8. return <li key={index}>{item}</li>;
  9. })}
  10. </ul>
  11. );
  12. }
  13. }
  14. // 解析结果
  15. function render(){
  16. const list = this.props.data
  17. return React.createElement(
  18. "ul",
  19. null,
  20. list.map((item,index)=>{
  21. return React.createElement(
  22. "li",
  23. {key:index}),
  24. item
  25. })
  26. )
  27. }

3.实践

1.首先创建初始化package.json

2.安装以下依赖,并配置要执行编译的jsx文件

image.png

3.执行命令 npm run transform就可以看到编译后的文件代码

image.png

4.在JSX中使用表达式

1.jsx本身也是表达式
2.在属性中使用表达式
3.延展属性
4.表达式作为子元素

5.JSX优点

1.声明式创建页面直观
2.代码动态创建界面的灵活
3.无需学习多的模板语言

6.JSX约定

1.React认为小写的tag是原生的DOM节点,如div
2.大写字母开头为自定义组件
3.jsx标记可以直接使用属性语法,如

7.思考问题解答

1.JSX本质是什么,它和JS之间到底是什么关系?
JSX 的本质是React.createElement这个 JavaScript 调用的语法糖。是JS的语法扩展
**
2.为什么要用 JSX?不用会有什么后果?
JSX 语法糖允许前端开发者使用我们最为熟悉的类 HTML 标签语法来创建虚拟 DOM,在降低学习成本的同时,也提升了研发效率与研发体验。
如果使用 React.createElement,代码多了,就会感觉代码很杂乱。

3.JSX背后的功能模块是什么,这个功能模块的背后到底做了什么?
image.png

8.小结

  • jsx其实是语法糖
  • 开发环境会将jsx编译成js代码
  • jsx的写法会大大降低学习成本和工作量
  • 同时,jsx也会增加debug成本