🚀 React JSX 语法讲解

1. 课程概述

本课程旨在系统讲解 JSX(JavaScript XML) 的核心概念与实战应用。JSX 是 React 的核心语法扩展,它允许我们在 JavaScript 中编写类似 HTML 的结构,使得构建用户界面变得直观和高效。通过本课程,学生将从理解 JSX 的本质出发,逐步掌握其语法规则、表达能力、与 HTML 的差异,最终能够熟练运用 JSX 构建动态、可复用的 React 组件。

2. 知识目标与实例佐证

知识目标具体内容与实例佐证对应代码示例(简略)
理解 JSX 的本质与编译原理JSX 是 JavaScript 的语法扩展,不是字符串也不是 HTML,最终会被编译(如通过 Babel)为 React.createElement() 函数调用。const element = <h1>Hello, JSX!</h1>; 编译为: React.createElement('h1', null, 'Hello, JSX!');
掌握 JSX 的核心语法规则- 标签必须闭合<img />
- 属性名使用 camelCaseclassName(代替 class),htmlFor(代替 for), onClick
- 必须有一个根元素:用 <div><>(Fragment)包裹。
<div className="container"><label htmlFor="name">Name:</label><img src="..."/></div>
理解 JSX 中的表达式与语句使用 {} 嵌入任何 JavaScript 表达式(变量、函数调用、运算、三元表达式等),但不能嵌入语句(如 if, for)。const name = 'Alice';
const element = <p>Hello, {name}! It's {new Date().toLocaleTimeString()}</p>;
{isLoggedIn ? <LogoutButton /> : <LoginButton />}
认识 JSX 与 HTML 的关键差异- JSX 是 JavaScript 的语法扩展,最终会转换为 JavaScript 对象。
- 一些 HTML 属性或标签在 JSX 中可能不适用(如 <script><style> 需谨慎使用)。
- JSX 允许添加自定义行为(如事件处理函数)和通过属性传递数据。
<button onClick={() => alert('Clicked!')}>Click Me</button>
<Welcome name="Alice" />
了解虚拟DOM与JSX的关系JSX 更像是描述 React 元素(虚拟DOM节点)结构和属性的“蓝图”或“模板”。React 使用 JSX 来高效地创建和更新虚拟 DOM,然后通过对比(diffing)来决定如何最有效地更新真实 DOM。JSX 描述 UI 应该是什么样子,而 React 负责将其高效地渲染和更新到页面上。

3. 技能目标与实战练习

技能目标具体实践与实例佐证实战代码示例(仅供参考)
创建与渲染JSX元素能够编写基本的JSX元素,并在React组件中返回它们。function Greeting() { return <h1>Hello, World!</h1>; }
在JSX中嵌入表达式与进行运算熟练使用 {} 嵌入变量、对象属性、函数调用结果和进行各种运算。function UserInfo({ user, score }) { return <p>User: {user.name}, Score: {score * 10}</p>; }
使用JSX进行条件渲染掌握使用三元表达式逻辑与(&&)运算符实现条件的条件渲染。function WelcomeMessage({ isLoggedIn, username }) { return ( <div> {isLoggedIn ? <h1>Welcome back, {username}!</h1> : <h1>Please log in.</h1>} {hasUnreadMessages && <p>You have unread messages!</p>} </div> ); }
使用JSX进行列表渲染掌握使用数组的 map() 方法渲染列表数据,并为每个列表项添加唯一的 key 属性(通常使用数据id,而非索引)以提高渲染性能。function TodoList({ todos }) { return ( <ul> {todos.map(todo => ( <li key={todo.id}>{todo.text}</li> ))} </ul> ); }
在JSX中绑定事件与处理交互掌握为元素添加事件处理函数(如 onClick, onChange),注意使用驼峰命名传递函数引用(而非调用)。并能阻止默认事件行为。function Button() { function handleClick(e) { e.preventDefault(); alert('Clicked!'); } return <button onClick={handleClick}>Click Me</button>; }
组合使用JSX与组件构建界面能够将JSX结构拆分为可复用的组件,并通过 props 向组件传递数据(包括基本类型、对象、数组甚至函数)来动态渲染内容。function App() { return ( <div> <Welcome name="Sara" /> <TodoList todos={todoItems} /> </div> ); }

4. 综合实战案例:简易任务卡片列表

下面是一个融合了多项技能目标的实战示例,您可以在课堂上引导学生实现:

// 任务卡片组件 - 接收props,条件渲染,内联样式
function TaskCard({ title, description, completed, onToggle }) {const cardStyle = {border: '1px solid #ddd',borderRadius: '8px',padding: '16px',margin: '10px 0',backgroundColor: completed ? '#e8f5e9' : '#f9f9f9'};return (<div style={cardStyle}><h3>{title}</h3><p>{description}</p><p>Status: {completed ? '✅ Completed' : '❌ Incomplete'}</p><button onClick={onToggle}>{completed ? 'Mark Incomplete' : 'Mark Complete'}</button></div>);
}// 主应用组件 - 状态管理,列表渲染,传递props
function TaskBoard() {const [tasks, setTasks] = useState([{ id: 1, title: 'Learn JSX', description: 'Complete the JSX tutorial', completed: true },{ id: 2, title: 'Build a React App', description: 'Create your first component', completed: false },{ id: 3, title: 'Practice State Management', description: 'Understand useState hook', completed: false }]);const handleToggleTask = (taskId) => {setTasks(tasks.map(task =>task.id === taskId ? { ...task, completed: !task.completed } : task));};return (<div><h1>Task Board</h1>{/* 条件渲染:显示未完成任务数量 */}<p><strong>{tasks.filter(t => !t.completed).length}</strong> tasks remaining</p>{/* 列表渲染:使用map和key */}<div>{tasks.map(task => (<TaskCardkey={task.id} // 必须提供唯一的keytitle={task.title}description={task.description}completed={task.completed}onToggle={() => handleToggleTask(task.id)} // 传递函数作为prop/>))}</div></div>);
}

案例技能点解析

  • 组件与PropsTaskCard 组件接收多个 props 来展示不同内容。
  • 条件渲染:根据 completed 状态改变背景色和显示文本。
  • 列表渲染与key:使用 map 渲染列表,并为每个 TaskCard 提供唯一 key
  • 事件处理:点击按钮触发 onToggle 函数,更新父组件状态。
  • State提升:状态管理在父组件 TaskBoard 中,通过函数prop (handleToggleTask) 与子组件通信。
  • 内联样式:根据状态动态计算样式对象。
  • JSX表达式:在 {} 内进行计算和条件判断。

5. 课后练习与挑战

  1. 基础练习:创建一个 UserProfile 组件,接受 nameagehobbies(数组)作为 props,并渲染出来。为爱好列表添加 key。
  2. 进阶挑战:在上述任务列表中添加新增任务的功能,并实现本地存储(localStorage)持久化任务数据。
  3. 思考题:为什么在列表渲染中,使用数组索引 (index) 作为 key 在某些情况下可能会带来问题?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95786.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95786.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95786.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件安装教程(四):在 Windows 上安装与配置 MATLAB(超详细)

文章目录前言1. 安装前准备&#xff08;必看&#xff09;2. 下载 MATLAB&#xff08;推荐在线安装&#xff09;3. 在 Windows 上安装&#xff08;详细步骤&#xff09;4. 激活 MATLAB&#xff08;在线与离线&#xff09;5. 首次启动与界面入门6. 推荐的基本配置&#xff08;让环…

【运维自动化-标准运维】如何创建流程嵌套(子流程)

什么是子流程节点 标准运维里的流程节点有两类&#xff1a;标准插件节点和子流程节点。子流程节点实际上也是一个流程&#xff0c;比如某个业务线做全网更新时需要更新多个模块&#xff0c;那每个模块的更新流程可以称之为一个子流程。在总流程里直接添加子流程&#xff0c;就通…

clickhouse迁移工具clickhouse-copier

原来的集群没有高可用而且配置很低&#xff0c;所有准备将一个3分片1副本集群迁到1分片2副本的高配置集群&#xff0c;数据量比较大。 虽然官方已经标记clickhouse-copier已经过时&#xff0c;但为了方便和高效还是用了copier&#xff0c;效果还挺好 以下是使用步骤&#xff1a…

高频超声波传感器:以精准感知重塑未来科技生态

在智能制造的浪潮中&#xff0c;高频超声波传感器正以“隐形工程师”的角色&#xff0c;重新定义着工业检测、医疗诊断与环境监测的边界。这款融合了压电材料科学与微纳电子技术的精密仪器&#xff0c;凭借其亚毫米级测量精度与纳秒级响应速度&#xff0c;正在成为高端装备制造…

残差连接与归一化结合应用

残差连接&#xff08;Residual Connection / Skip Connection&#xff09;和归一化&#xff08;Normalization&#xff09;的结合&#xff0c;是现代深度学习模型&#xff08;尤其是深度神经网络和Transformer架构&#xff09;成功的关键因素之一。 核心概念回顾残差连接 (Resi…

K8s集群+Rancher Server:部署DolphinScheduler 3.2.2集群

本文手把手演示了如何在 K8s Rancher 环境中快速拉起一套生产可用的 Apache DolphinScheduler 3.2.2 集群。全文围绕“镜像加速、依赖本地化、存储持久化”三大痛点展开&#xff0c;附有详细的代码解析&#xff0c;收藏细看吧&#xff01; 环境准备 1、软件准备2、环境规划部署…

查询语言的进化:SQL之后,为什么是GQL?数据世界正在改变

数据是现代世界的核心驱动力。 在数据驱动的世界里&#xff0c;查询语言就像人与数据沟通的桥梁。 如何高效地获取、操作和理解数据&#xff0c;取决于查询语言的演进。 自20世纪70年代关系型数据库兴起以来&#xff0c;SQL&#xff08;Structured Query Language&#xff0…

AgentThink:一种在自动驾驶视觉语言模型中用于工具增强链式思维推理的统一框架

文章目录摘要1. 引言2. 相关工作2.1 自动驾驶中的语言模型2.2 自动驾驶中的视觉问答3. 方法3.1 数据生成流水线3.2 两阶段训练流程3.2.1 基于 SFT 的推理预热3.2.2 基于 RLFT 的推理增强3.3 推理与评估4. 实验4.1 主要实验结果4.2 工具使用分析4.3 消融实验4.4 泛化性评估5. 结…

Bug 排查日记:打造高效问题定位与解决的技术秘籍

一、引言在软件开发的漫漫征程中&#xff0c;Bug 如影随形&#xff0c;成为开发者们必须跨越的一道道障碍。它们或如微小的瑕疵&#xff0c;影响用户体验&#xff1b;或似隐藏的炸弹&#xff0c;引发系统故障&#xff0c;导致严重后果。高效排查 Bug&#xff0c;不仅是保障软件…

使用 Sentry 为 PHP 和 Web 移动小程序提供多平台错误监控

今天我在 reddit 上看到 Sentry 的推广&#xff0c;想到 19 年我第一次在公司自研产品b2b2c上使用 Sentry 的经历&#xff0c;后面在其他项目上多次使用Sentry&#xff0c;今天就顺手分享一下在 Laravel 项目中接入 Sentry 的实践心得。现代项目往往涉及 Web、移动端和小程序&a…

Python包管理工具全对比:pip、conda、Poetry、uv、Flit深度解析

在Python开发中&#xff0c;包的管理和使用是重要环节&#xff0c;现如今python包管理工具众多&#xff0c;如何选择合适的管理工具&#xff1f;常用的工具有pip、conda、Poetry、uv、Flit&#xff0c;下面这些工具进行详细对比分析。一、工具概览对比工具类型开发者主要特点适…

车载诊断架构 --- Service 14一丢丢小汇总

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做你把时间花在哪里,你的人生就在哪里。千万别看见别人发光,就觉得自己暗淡。人生如逆旅,你我皆行人。唯有不断阅己、越己、悦己才能活出生命的意…

Struts2 工作总结

一 in&#xff0c;在SQL中&#xff0c;IN 是一个条件操作符&#xff0c;用于指定多个可能的值&#xff0c;通常用在 WHERE 子句中。它的作用是检查某个字段的值是否在给定的值列表中&#xff0c;相当于多个 OR 条件的简写形式。不使用 IN&#xff08;冗长&#xff09;SELECT * …

MQTT 认证与授权机制实践(二)

四、实战案例&#xff1a;主流 Broker 的认证授权配置指南&#xff08;一&#xff09;EMQ X&#xff1a;企业级物联网 Broker 的安全方案1. 认证配置&#xff08;用户名密码 证书&#xff09;EMQ X 作为一款企业级物联网 Broker&#xff0c;在安全认证方面提供了丰富且灵活的配…

多路转接介绍及代码实现

目录 1.多路转接技术的产生背景 2.select 3.poll 3.epoll 1.多路转接技术的产生背景 一个技术的出现必然有它要解决的问题,那么多路转接解决的问题是什么嗯? 我们知道,一个进程里面有一个文件描述符表管理这个进程所打开的文件,我们进行网络通信的时候,本质就是创建一个…

《sklearn机器学习——回归指标1》

skearn.metrics模块实现一些损失函数&#xff0c;评分&#xff0c;并且应用函数去测度回归标签。其中一些已经改进&#xff0c;可以处理多指标案例&#xff1a;mean_squared_error&#xff0c;mean_absolute_error&#xff0c;explained_variance_score和r2_score。 这些函数使…

消息存储机制-索引文件及页缓存

对于生产者来说&#xff0c;将消息写到commit log文件里面。这里会有消息的逻辑队列&#xff0c;逻辑队列里面保存了消息的偏移量。除了consumerquenue之外&#xff0c;它还会将数据分发到另外一个文件叫indexfile索引文件里面。这个索引文件可以保存消息的一些信息&#xff0c…

辗转相除法(欧几里得算法)的证明

欢迎访问我的主页: https://heeheeaii.github.io/ 辗转相除法是一种用于计算两个非负整数最大公约数的有效算法。它的证明主要分为两个部分&#xff1a; 证明核心引理&#xff1a; gcd(a,b)gcd(b,amodb)证明算法的收敛性&#xff1a; 证明算法一定会在有限步内结束。 辗转相除法…

RL【3】:Bellman Optimality Equation

系列文章目录 文章目录系列文章目录前言Definition of optimal policyBellman optimality equationIntroductionMaximization on the right-hand sideContraction mapping theoremSolutionOptimalityAnalyzing optimal policies总结前言 本系列文章主要用于记录 B站 赵世钰老师…

有序数组,距离目标最近的k个数 二分查找

&#x1f914; 新手做题思路&#xff1a;第1步&#xff1a;理解题目- 找距离x最近的k个数- 数组已排序- 返回结果也要排序&#xff08;升序&#xff09;- 距离相同时&#xff0c;选择较小的数第2步&#xff1a;关键insight- 数组已排序 → 考虑二分查找- 最近的k个数一定是连续…