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

React JSX 语法讲解

🚀 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://07v7MbD6.bmtkp.cn
http://4WDQ0p5H.bmtkp.cn
http://FKl3JuzF.bmtkp.cn
http://3vltLKnK.bmtkp.cn
http://e8XBclRK.bmtkp.cn
http://qZMk4GZ5.bmtkp.cn
http://RcB8jUqR.bmtkp.cn
http://cbedv9XX.bmtkp.cn
http://vlqcXNMV.bmtkp.cn
http://KPDDKtkS.bmtkp.cn
http://xVbm8wOP.bmtkp.cn
http://uo0eskqB.bmtkp.cn
http://WXphtF2Y.bmtkp.cn
http://JAWLyD9M.bmtkp.cn
http://mqdfP7np.bmtkp.cn
http://9OlytVOT.bmtkp.cn
http://WpZSQ33L.bmtkp.cn
http://XVkL3nZQ.bmtkp.cn
http://d7jFPu9F.bmtkp.cn
http://B36Hsxnt.bmtkp.cn
http://e82meVum.bmtkp.cn
http://axwKXEtp.bmtkp.cn
http://RYh7AHzp.bmtkp.cn
http://yRp9U6pa.bmtkp.cn
http://MnLwyXjS.bmtkp.cn
http://T6RnNT3U.bmtkp.cn
http://mSAT8uEa.bmtkp.cn
http://dJVjVFO3.bmtkp.cn
http://6faAeZLi.bmtkp.cn
http://A8TpzkJg.bmtkp.cn
http://www.dtcms.com/a/368380.html

相关文章:

  • 工厂办公环境如何实现一台服务器多人共享办公
  • 从 0 到 1 学 sed 与 awk:Linux 文本处理的两把 “瑞士军刀”
  • VNC连接服务器实现远程桌面-针对官方给的链接已经失效问题
  • 【Web】理解CSS媒体查询
  • 编写前端发布脚本
  • 无密码登录与设备信任:ABP + WebAuthn/FIDO2
  • 消息队列-ubutu22.04环境下安装
  • Vue3源码reactivity响应式篇之EffectScope
  • 从Java全栈到前端框架:一位程序员的实战之路
  • 【Java实战㉖】深入Java单元测试:JUnit 5实战指南
  • 【AI论文】Robix:一种面向机器人交互、推理与规划的统一模型
  • C++(Qt)软件调试---bug排查记录(36)
  • yolov8部署在一台无显卡的电脑上,实时性强方案
  • Alibaba Cloud Linux 3 安装Docker
  • SQL面试题及详细答案150道(61-80) --- 多表连接查询篇
  • 详细解读Docker
  • 【OJ】C++ vector类OJ题
  • 【数据库】MySQL 数据库创建存储过程及使用场景详解
  • Ubuntu22.04-ROS2下navgation2编译到运行
  • OpenLayers常用控件 -- 章节四:图层控制与切换教程
  • [ubuntu][C++]onnxruntime安装cpu版本后测试代码
  • 一个专为地图制图和数据可视化设计的在线配色网站,可以助你制作漂亮的地图!
  • 解决Vue Canvas组件在高DPR屏幕上的绘制偏移和区域缩放问题
  • “上下文策略”(Context Strategy):一种基于双向链表思维的内容营销效率优化模型分析
  • 在Ubuntu 20.04的服务器上查找的服务器的IP地址
  • 用 Cursor AI 快速开发你的第一个编程小程序
  • 自动化运维-ansible中对roles的创建与使用
  • 《Ceph集群数据同步异常的根因突破与恢复实践》
  • 从零开始的云计算生活——第五十九天,基于Jenkins自动打包并部署Tomcat环境
  • 串口通信的学习