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

【React】JSX:从基础语法到高级用法的深入解析

文章目录

    • 一、什么是 JSX?
      • 1. 基础语法
      • 2. 嵌入表达式
      • 3. 使用属性
      • 4. JSX 是表达式
    • 二、JSX 的注意事项
      • 1. 必须包含在单个父元素内
      • 2. JSX 中的注释
      • 3. 避免注入攻击
    • 三、JSX 的高级用法
      • 1. 条件渲染
      • 2. 列表渲染
      • 3. 内联样式
      • 4. 函数作为子组件
    • 四、最佳实践

在 React 开发中,JSX 是一个核心概念。JSX 允许我们在 JavaScript 代码中直接编写类似 HTML 的代码,使得组件的构建和维护变得更加直观和高效。本文将详细介绍 JSX 的基础语法、注意事项以及高级用法,帮助你深入理解和掌握 JSX。

一、什么是 JSX?

JSX(JavaScript XML)是一种语法扩展,它让我们可以在 JavaScript 中编写类似 HTML 的代码。它与 JavaScript 紧密结合,并在编译时被转换为 JavaScript 对象。

1. 基础语法

JSX 的语法与 HTML 非常相似,但存在一些差异。例如,在 JSX 中,所有的标签必须闭合,自闭合标签需要添加斜杠。

// 正确的 JSX 语法
const element = <h1>Hello, world!</h1>;// 自闭合标签
const image = <img src="logo.png" alt="Logo" />;

2. 嵌入表达式

在 JSX 中,我们可以使用大括号 {} 来嵌入 JavaScript 表达式。任何有效的 JavaScript 表达式都可以放在大括号内。

const name = 'React';
const element = <h1>Hello, {name}!</h1>;

3. 使用属性

在 JSX 中,可以像在 HTML 中一样使用属性,但需要注意的是,属性名采用 camelCase 命名,而不是 HTML 中的 kebab-case。

const element = <img src="logo.png" className="logo" alt="Logo" />;

4. JSX 是表达式

JSX 本质上是 JavaScript 的表达式。这意味着我们可以在 if 语句和 for 循环中使用 JSX,将其赋值给变量,作为参数传递,以及作为函数的返回值。

function getGreeting(user) {if (user) {return <h1>Hello, {user.name}!</h1>;}return <h1>Hello, Stranger.</h1>;
}

二、JSX 的注意事项

1. 必须包含在单个父元素内

JSX 表达式必须有一个父元素包裹。如果要返回多个元素,可以使用 <div> 或者 React 提供的 <React.Fragment> 来包裹。

// 错误的 JSX 语法
const element = (<h1>Hello, world!</h1><h2>Welcome to learning React.</h2>
);// 正确的 JSX 语法
const element = (<div><h1>Hello, world!</h1><h2>Welcome to learning React.</h2></div>
);// 使用 React.Fragment
const element = (<React.Fragment><h1>Hello, world!</h1><h2>Welcome to learning React.</h2></React.Fragment>
);

2. JSX 中的注释

在 JSX 中添加注释需要使用大括号和 JavaScript 注释语法。

const element = (<div>{/* 这是一个注释 */}<h1>Hello, world!</h1></div>
);

3. 避免注入攻击

React 会自动对嵌入在 JSX 中的所有值进行转义,防止注入攻击。这意味着我们无法通过 JSX 插入恶意代码。

const title = response.potentiallyMaliciousInput;
// 该 JSX 是安全的
const element = <h1>{title}</h1>;

三、JSX 的高级用法

1. 条件渲染

在 JSX 中,可以使用 JavaScript 的条件操作符来实现条件渲染。

使用三元运算符

const isLoggedIn = true;
const element = isLoggedIn ? <h1>Welcome back!</h1> : <h1>Please sign up.</h1>;

使用 && 操作符

const unreadMessages = ['React', 'Re: React', 'Re:Re: React'];
const element = (<div><h1>Hello!</h1>{unreadMessages.length > 0 && <h2>You have {unreadMessages.length} unread messages.</h2>}</div>
);

2. 列表渲染

使用 Array.prototype.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>
);

3. 内联样式

在 JSX 中应用样式可以使用对象语法,属性名采用 camelCase。

const divStyle = {color: 'blue',backgroundColor: 'lightgray'
};const element = <div style={divStyle}>Styled div</div>;

4. 函数作为子组件

可以将函数作为子组件传递,从而实现更灵活的组件渲染。

function WelcomeDialog(props) {return (<Dialog>{props.children}</Dialog>);
}function App() {return (<WelcomeDialog>{name => <h1>Hello, {name}!</h1>}</WelcomeDialog>);
}

四、最佳实践

  1. 使用 ESLint 和 Prettier

通过使用 ESLint 和 Prettier 可以保持代码风格的一致性,并且有助于早期发现潜在的错误。

  1. 分离逻辑和表现

尽量将逻辑和表现分离,使组件更加简洁和易于维护。可以通过自定义 Hooks 或者容器组件来实现这一点。

  1. 合理使用组件

将页面或应用拆分为多个小组件,每个组件只负责一个特定的功能或部分。这样可以提高代码的可重用性和可维护性。

  1. 注意性能优化

React 提供了多种性能优化的方法,如使用 React.memouseCallback 来减少不必要的渲染,使用代码拆分(Code Splitting)和懒加载(Lazy Loading)来优化初始加载时间。


在这里插入图片描述

相关文章:

【React】JSX:从基础语法到高级用法的深入解析

文章目录 一、什么是 JSX&#xff1f;1. 基础语法2. 嵌入表达式3. 使用属性4. JSX 是表达式 二、JSX 的注意事项1. 必须包含在单个父元素内2. JSX 中的注释3. 避免注入攻击 三、JSX 的高级用法1. 条件渲染2. 列表渲染3. 内联样式4. 函数作为子组件 四、最佳实践 在 React 开发中…...

JMeter 使用

1.JMeter 是什么&#xff1f; JMeter 是一款广泛使用的开源性能测试工具&#xff0c;由 Apache 软件基金会维护。它主要用于测试 Web 应用程序的负载能力和性能&#xff0c;但也支持其他类型的测试&#xff0c;如数据库、FTP、JMS、LDAP、SOAP web services 等。 2.特点&#x…...

20240724----安装git和配置git的环境变量/如何用命令git项目到本地idea

备注参考博客&#xff1a; 1&#xff09;可以参考博客&#xff0c;用git把项目git到本地 2&#xff09;可以参考博客vcs没有git 3)git版本更新&#xff0c;覆盖安装 &#xff08;一&#xff09;安装git &#xff08;1&#xff09;官网下载的链接 https://git-scm.com/downlo…...

JavaScript实战 - 用Canvas画一个心形

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问或建议&#xff0c;请私信或评论留言&#xff01; 前言&#xff1a; 如…...

vim gcc

vim 使用 vs filename 分屏 ctrl ww 切窗口 shift zz 快速提出vim vim配置 vim启动时自动读取当前用户的家目录的.vimrc文件 vim配置只影响本用户 其他用户观看同一文件不受影响 gcc指令 & c文件编译过程 动态库 静态库 & 链接方式 有相应库才能进行…...

Symfony 表单构建器:创建和管理表单的最佳实践

Symfony 表单构建器&#xff1a;创建和管理表单的最佳实践 Symfony 是一个流行的 PHP 框架&#xff0c;以其强大的功能和灵活性闻名。表单构建器是 Symfony 中一个非常重要的组件&#xff0c;它提供了简单且高效的方式来创建和管理表单。本文将详细介绍 Symfony 表单构建器的最…...

Intel电脑CPU的选择

酷睿 i5/i7/i9 系列至强 Xeon 系列应用场景家用消费级电脑企业服务器工作站PCIe通道数 16X 最多识别到2张显卡&#xff0c;且每张降速为8X 64X 最多支持8张显卡同时使用 内存信道2通道8通道内存容量最大128GB最大6TB工作时长不建议长期不间断连续使用专为365*24不断电使用而设…...

MySQL字段设置的varchar长度小于数据长度自动截取丢弃超出的长度而不是报错?

MySQL字段设置的varchar长度小于数据长度自动截取丢弃超出的长度而不是报错&#xff1f; 事情是这样的&#xff0c;我们一个订单表存放了商品的快照信息其中快照信息存储的是json格式商品信息&#xff0c;当查看订单是报错了&#xff0c;发现我们后端服务查询到订单的快照信息…...

Linux|多线程(三)

线程池 线程池是一种多线程处理形式&#xff0c;处理过程中它将被提交的任务分配给预先创建好的多个线程中的一个去执行。 线程池的实现 #pragma once #include <pthread.h> #include <vector> #include <string> #include <unistd.h> #include <…...

智能合约中如何返回mapping

在 Solidity 中&#xff0c;直接返回一个 mapping 的所有数据是不可能的&#xff0c;因为 mapping 本身不支持直接遍历。但是&#xff0c;可以使用一些技巧来实现这一目标&#xff0c;例如通过维护一个额外的数组来跟踪 mapping 中的键&#xff0c;并通过这个数组来返回所有的键…...

nginx的学习(二):负载均衡和动静分离

简介 nginx的负载均衡和动静分离的简单使用 负载均衡配置 外部访问linux的ip地址:80/edu/a.html地址&#xff0c;会轮询访问Tomcat8080和Tomcat8081服务。 Tomcat的准备 准备两个Tomcat&#xff0c;具体准备步骤在nginx的学习一的反向代理例子2中&#xff0c;在Tomcat8080…...

普中51单片机:DS1302时钟芯片讲解与应用(十)

文章目录 引言基本特性什么是RAM&#xff1f;什么是涓流充电&#xff1f; 电路图和引脚说明通信协议以及工作流程寄存器控制寄存器日历/时钟寄存器 DS1302读写时序代码演示——数码管显示时分秒 引言 DS1302 是一款广泛使用的实时时钟 (RTC) 芯片&#xff0c;具有低功耗、内置…...

Preact:轻量级替代React的选择

Preact是一个轻量级的JavaScript库&#xff0c;它提供了与React相似的API&#xff0c;但体积更小&#xff0c;性能更优。Preact的核心理念是尽可能地保持与React的兼容性&#xff0c;同时去除不必要的部分&#xff0c;使其成为一个理想的替代品&#xff0c;尤其是在对性能和包大…...

全栈嵌入式C++、STM32、Modbus、FreeRTOS和MQTT协议:工业物联网(IIoT)可视化系统设计思路(附部分代码解析)

项目概述 随着工业4.0时代的到来&#xff0c;工业物联网&#xff08;IIoT&#xff09;在提高生产效率、降低运营成本和实现智能制造方面得到了广泛应用。本项目旨在开发一个全面的工业物联网监控系统&#xff0c;能够实时监测设备的温度、压力、振动和电流等参数&#xff0c;并…...

Greenplum数据库中的数据倾斜问题及处理方法

一、数据倾斜问题的原因 数据分布不均匀&#xff1a;当数据在表的分区或分片中不均匀分布时&#xff0c;会导致某些分区或分片的数据量较大&#xff0c;从而引发数据倾斜问题。连接键存在热点数据&#xff1a;如果连接操作中使用的键值存在热点数据&#xff0c;即某些键值出现…...

缓存设计理论

缓存设计理论是一个涉及多个方面的复杂主题&#xff0c;主要目标是优化数据访问速度&#xff0c;减少数据访问延迟&#xff0c;提高系统性能&#xff0c;并同时保持数据的一致性和系统的稳定性。以下是从几个关键方面对缓存设计理论的概述&#xff1a; 一、缓存的作用与目的 …...

IDEA-安装插件 驼峰下划线转换

第一步&#xff1a;安装 file-settings-plugins-在marketplace搜索“CamelCase”-点击安装 第二步&#xff1a;设置 file-settings-editor-camel_case 第三步&#xff1a;使用 选中想转换的遍历 使用快捷键 Alt Shift U...

乾坤: 微前端项目切换时样式闪动(从无样式变为正常样式需要等 css chunk 文件加载完成, 加载延时受网速影响)

背景: 点击基座项目页面左侧目录, 进入微前端子项目页面, 会有短暂的样式未加载效果一闪而过, 造成页面闪烁或更严重的其他样式错位问题 定位: 同事查了 qiankun git 项目的 issue: https://github.com/umijs/qiankun/issues/219 , 找到解决方案 解决: 项目 webpack 打包配…...

《电子元器件之固态电容》

固态电容全称是固态铝质电解电容&#xff0c;它与普通液态铝质电解电容的最大差别在于采用了不同的介电材料。液态铝电容介电材料为电解液&#xff0c;而固态电容的介电材料是固态的导电性高分子材料。 固态电容和液态电容&#xff0c;从外观上区分&#xff0c;就是固态电容顶…...

PLC 远程下载网关

一、 产品概述 SSF-BOX-100 是三石峰科技有限公司推出的工业级 PLC 远程下载网关&#xff0c;主 要用于 PLC 远程调试、程序上下载&#xff0c;为用户提供一种简单可靠的远程维护方案。 1.1 SGBOX 软件 SGBOX 软件是 SSF-BOX-100 网关的配套软件&#xff0c;可以查看设备状态…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...