现代 React Web 开发实战
宋一玮
FreeWheel 中国研发中心前端架构师
16115 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
现代 React Web 开发实战
15
15
1.0x
00:00/00:00
登录|注册

04|JSX:如何理解这种声明式语法糖?

你好,我是宋一玮。上节课我们利用 Create React App(CRA)脚手架工具创建了一个 React 项目,并在项目中部分实现了一个简单的看板应用。在接下来的课程里,我们会把看板应用抽丝剥茧,逐一认识学习项目里涉及到的 React 概念和 API。很自然地,我们这节课会讲到 JSX 语法和 React 组件。
有不少初学者对 React 的第一印象就是 JSX 语法,以至于会有这样的误解:
JSX 就是 React?
JSX 就是 React 组件?
JSX 就是另一种 HTML?
JSX 既能声明视图,又能混入 JS 表达式,那是不是可以把所有逻辑都写在 JSX 里?
这些误解常会导致开发时遇到各种问题:
写出连续超百行、甚至近千行的 JSX 代码,既冗长又难维护;
在 JSX 的标签上添加了 HTML 属性却不生效;
JSX 混入 JS 表达式后,页面一直报错。
其实只要理清了 JSX 和 React 组件的关系,这些问题自然不在话下。
总的来说,React 是一套声明式的、组件化的前端框架。顾名思义,声明(动词)组件是 React 前端开发工作最重要的组成部分。在声明组件的代码中使用了 JSX 语法,JSX 不是 HTML,也不是组件的全部。
接下来,我们就详细展开介绍 JSX 和 React 组件。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JSX是React中的一种声明式语法糖,为前端开发带来了便利。它提供了类HTML/XML的语法,使得声明代码更直观、易于维护,提高了开发效率。同时,JSX中的JS部分也得到了强调,能够直接利用JS语句,实现条件渲染和循环渲染等功能。文章还对声明式和命令式编程范式进行了对比,强调了React作为声明式的前端技术的特点。此外,还介绍了JSX的基本写法、命名规则、JSX元素类型、JSX子元素类型以及JSX中的JS表达式。总的来说,JSX作为一种语法糖,为React的推广和流行起到了至关重要的作用。文章内容深入浅出,通过对比和举例,使读者更好地理解了JSX的概念和特点。另外,文章还介绍了React组件的发展历程,从最初的`React.createClass`到无状态函数组件,以及函数组件在React Hooks发布后的流行。这些内容帮助读者了解了React组件的演变和背后的原因。文章最后提出了思考题,引发读者对JSX在其他技术和领域的应用进行深入思考。整体而言,本文内容丰富,涵盖了JSX和React组件的重要概念和发展历程,对于前端开发者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 React Web 开发实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • Geek_fcdf7b
    首先,感谢老师对于评论区的每个问题几乎都在回复,从评论中也学到了很多东西。然后,请教一下,V17之后,JSX好像不一定是编译成React.createElement了吧,好像有个react/jsx-runtime

    作者回复: 你好,Geek_fcdf7b,感谢你的指正。你说得对,React从17开始已经启用全新的JSX运行时来替代React.createElement。对这个变化,我的印象还停留在当时一个预发布版本的可选功能,就疏忽了。 在React 17版本,新JSX运行时的具体更新日志可参考: https://zh-hans.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html ; 引入新JSX运行时的动机主要是因为原有的React.createElement是为了类组件设计的,而目前函数组件已然成为主流,老接口限制了进一步的优化,具体可以参考官方的征求意见贴: https://github.com/reactjs/rfcs/pull/107 我在oh-my-kanban项目里验证了一下,确实在开发模式下JSX被编译成了react/jsx-dev-runtime下的jsxDEV,在生产模式下则被编译成了react/jsx-runtime下的jsx或jsxs(目前同jsx)。 var KanbanCard = function KanbanCard(_ref) { var title = _ref.title, status = _ref.status; return /*#__PURE__*/ (0, jsx_runtime.jsxs)("li", { className: "kanban-card", children: [ /*#__PURE__*/ (0, jsx_runtime.jsx)("div", { className: "card-title", children: title, }), /*#__PURE__*/ (0, jsx_runtime.jsx)("div", { className: "card-status", children: status, }), ], }); }; 从编译结果看,与React.createElement在children的处理上是不同,jsx的children直接就是props的一部分。 JSX的语法没有改变,返回值也都是React元素,代码编译器对开发者隐藏了新旧API的差异。从学习理解JSX的角度,影响不大。大家可以先按照目前的文稿来学习,我后续写完新稿后会回来更新文稿。 再次感谢Geek_fcdf7b!

    2022-09-03归属地:北京
    13
  • coderHOW
    1. JSX 是函数的语法糖,那 JS 相关框架函数都能实现 JSX 2. 函数的原理就是输入什么会得到一个确定的结果返回,理论上就可以输出成其他需要的结果

    作者回复: 你好,coder,很棒的答案!正如你提到的,诸如Vue和Solid.js这些JS框架也都加入了JSX特性。

    2022-08-31归属地:北京
    7
  • null
    这一节课下来干货好多哇

    作者回复: 你好,万千观众之一,多谢你的评论,希望你有所收获。当然,如果发现后面课程内容过于干以至于不好消化的话,请务必告诉我,我会尽量调整。

    2022-08-30归属地:北京
    4
  • 心叶
    讲到jsx,为什么不直接拿出官方文档呢? https://facebook.github.io/jsx/ 从文档你可以知道: jsx不是react的api,虽然是react团队搞出来的 他的灵感是es4里面的e4x,但原本的e4x因为涉及到语法和语义的定义,实现过于复杂所以被弃用。 jsx的目标是供预处理器使用,将其转换成es

    作者回复: 你好,心叶,你提到的JSX的官方文档 https://facebook.github.io/jsx/ 确实是最权威的也是最精炼的,不过它是以web规范的格式写作的,初学时读起来可能会有些费力。其他同学在基本掌握JSX后,感兴趣的话也可以回来读一下这篇文档,一定会发现它的妙处。 另外你提到了ES4,真是闻者伤心听者流泪,业界最贴近ES4规范的实现是Adobe Flash中的ActionScript 3语言,随着Flash技术的覆灭,ECMA毅然抛弃了ES4,转而发布了ES5,之后也成为了各浏览器JS标准化的基石。

    2022-08-31归属地:北京
    3
  • 学习前端-react
    请问:如上我们理解的声明式在编程上便是函数式编程,在jsx上便是 三目运算符 和 Function map,所有在vue的模板里,v-if v-for 是不是不太声明式?

    作者回复: 你好,Geek_8aba0d,函数式编程是声明式的一种,但声明式还有其他编程范式;JSX是一种声明式,但声明式还有其他模版技术。在前端领域,我们提到声明式时,对应的另一边主要还是命令式。在我看来Vue的v-if、v-for,与Angular里*ngIf、*ngFor,都不能算作是命令式,所以它们也是声明式的。

    2022-09-01归属地:北京
    2
  • 东方奇骥
    1. JSX 一定得是 React 吗?React 以外的技术能不能使用 JSX? 答:不一定。JSX 并不是一个新的模板语言,可以认为是一个语法糖。比如Vue也有JSX。 2. JSX 一定得生成 HTML 吗?可以用 JSX 生成其他模版吗? 答:课程中讲到,本质上来说,JSX可以认为是一个语法糖,最终还是调用React.createElement. 所以理解重写一个createElement也可能生成别的,不一定是HTML。

    作者回复: 你好,东方奇骥,很棒的答案!你说得对,createElement也可以生成别的,比如React Native中的移动端原生组件。

    2022-08-31归属地:北京
    2
  • 学习前端-react
    JSX 一定得是 React 吗?React 以外的技术能不能使用 JSX?  不是 这是一个dsl ,其他语言只要实现其底层,便可使用其上层的jsx JSX 一定得生成 HTML 吗?可以用 JSX 生成其他模版吗? 如上。

    作者回复: 你好,Geek_8aba0d,很好的答案。

    2022-09-01归属地:北京
    1
  • 阿阳
    最近在vue项目中引入了jsx,在自定义组件的时候,恰好踩到了这节课说的几个坑。帮助很大。 jsx应该不是react独有的,它只是个语法糖,它可以被编译为任意的其他渲染函数。

    作者回复: 我印象中Vue是从2版本加入了JSX特性,与它原有的template有一定替代关系,需要开发者做一些思路上的转换。不过在底层,正如你提到的,两者都会编译成Vue的渲染函数。

    2022-09-01归属地:北京
    1
  • 杨永安
    jsx本质是一个返回格式为json的node节点描述信息。可以用在跨端跨平台的用途,比如拿到json作为render蓝本的时候,最后的render会根据宿主环境对应调用相应API。 话说这课没有了吗?

    编辑回复: 每周二四六更新哈,还在更新中

    2022-08-31归属地:北京
    4
    1
  • Hello,Tomrrow
    JSX 不是在 React 中发明的,二者的关系更像是相互成就。

    作者回复: 你好,Hello, Tomrrow,很高兴看到你坚持打卡。你说得对,二者互相成就。

    2022-08-30归属地:北京
    1
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部