当前位置: 首页 > news >正文

React前端面试每日一试 2.JSX是什么?JSX如何工作?

JSX是什么?

JSX(JavaScript XML)是React引入的一种语法扩展,用于在JavaScript中编写类似HTML的结构。它让我们能够直观地描述UI的结构,同时保留JavaScript的编程能力。尽管JSX看起来像HTML,但它最终会被编译成标准的JavaScript代码。

JSX如何工作?

我的理解JSX其实本质是一种语法糖,它会被编译器(比如Babel)转换成功React.createElement方法调用.
工作流程如下:

  1. 编写JSX代码:开发者使用JSX语法编写React组件的UI结构。
  2. 编译JSX代码:在构建过程中,Babel等工具将JSX代码转换成React.createElement调用。
  3. 创建虚拟DOM元素:React.createElement返回一个描述UI结构的JavaScript对象,即虚拟DOM(react虚拟DOM在上一个问题提到过,不太了解虚拟DOM可以查看上一试)。
  4. 渲染到真实DOM:React根据虚拟DOM生成或更新真实DOM,最终呈现给用户。

以上就是我们使用JSX实际的工作流程

示例代码

JSX代码

import React from 'react';const element = <h1>Hello, world!</h1>;

通过Babel的编译得到

import React from 'react';const element = React.createElement('h1', null, 'Hello, world!');

这里createElement方法接受三个参数:
1.表示要创建的元素类型(type),如div,span等等
2.包含该元素的属性(props),如className,id等等
3.该元素的子节点(children),如文本、其他元素或数组

高级用法示例

嵌入表达式:可以在JSX中嵌入任意的JavaScript表达式,使用花括号{}包裹。

const user = {firstName: 'Harper',lastName: 'Perez'
};const element = <h1>Hello, {user.firstName} {user.lastName}!</h1>;

条件渲染:可以使用条件运算符在JSX中实现条件渲染。

const isLoggedIn = true;const element = (<div>{isLoggedIn ? <h1>Welcome back!</h1> : <h1>Please sign in.</h1>}</div>
);

列表渲染:可以使用数组的map方法在JSX中渲染列表。

const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =><li key={number.toString()}>{number}</li>
);const element = (<ul>{listItems}</ul>
);

总结

JSX是React中用于描述UI结构的一种语法糖,通过编译器转换为React.createElement方法调用,然后创建对应的虚拟DOM,通过生成或更新最终生成真实DOM.
它的优势在于简洁、直观和强大的表达能力,使得构建复杂的用户界面变得更加容易和高效。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 新版GPT-4omini上线!快!真TM快!
  • mac 如何给默认终端(zsh)装插件,使得更美观易用
  • git-常用基础指令
  • Docker中安装的postgresql14在启用vector扩展的时候,找不到该扩展的控制文件。
  • 社交圈子聊天交友系统搭建社交app开发:陌生交友发布动态圈子单聊打招呼群聊app介绍
  • 虚拟局域网配置与分析-VLAN
  • go-kratos 学习笔记(4) 服务注册与发现 nacos注册
  • 以进程完成并发的UDP服务端
  • python中的fire和Linux shell中的参数传递
  • IDEA的pom.xml显示ignored 的解决办法
  • go-kratos 学习笔记(2) 创建api
  • JS递归遍历路由文件,修改hidden属性
  • 三、【Python】入门 - 第一个python程序
  • 微信小程序开发:项目程序代码构成
  • 【机器学习】FlyFlowerSong【人工智能】资源指南
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 《剑指offer》分解让复杂问题更简单
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Fabric架构演变之路
  • Laravel 实践之路: 数据库迁移与数据填充
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Objective-C 中关联引用的概念
  • PAT A1050
  • ReactNativeweexDeviceOne对比
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • RxJS: 简单入门
  • spring + angular 实现导出excel
  • Vue.js-Day01
  • 程序员最讨厌的9句话,你可有补充?
  • 分类模型——Logistics Regression
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 开源SQL-on-Hadoop系统一览
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 湖北分布式智能数据采集方法有哪些?
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)fread与fwrite详解
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (Forward) Music Player: From UI Proposal to Code
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (五)c52学习之旅-静态数码管
  • (一)WLAN定义和基本架构转
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • .NET CORE Aws S3 使用
  • .NET 的程序集加载上下文
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @JoinTable会自动删除关联表的数据
  • @selector(..)警告提示