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. 综合实战案例:简易任务卡片列表

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

jsx 复制代码
// 任务卡片组件 - 接收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 => (
          <TaskCard
            key={task.id} // 必须提供唯一的key
            title={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 在某些情况下可能会带来问题?
相关推荐
小高0074 小时前
🚨 2025 最该淘汰的 10 个前端 API!
前端·javascript·面试
一枚前端小能手4 小时前
🎨 页面卡得像PPT?浏览器渲染原理告诉你性能瓶颈在哪
前端·javascript
lssjzmn4 小时前
性能飙升!Spring异步流式响应终极指南:ResponseBodyEmitter实战与架构思考
java·前端·架构
毕设源码-郭学长4 小时前
【开题答辩全过程】以 基于vue在线考试系统的设计与实现为例,包含答辩的问题和答案
前端·javascript·vue.js
詩句☾⋆᭄南笙5 小时前
初识Vue
前端·javascript·vue.js
Javian5 小时前
浅谈前端工程化理解
前端
艾小码5 小时前
新人必看!3天啃下大型前端项目,我是这样做到的
前端
袁煦丞5 小时前
宝塔FTP远程文件管理+安全防护:cpolar内网穿透实验室第417个成功挑战
前端·程序员·远程工作
三十_5 小时前
【NestJS】构建可复用的数据存储模块 - 动态模块
前端·后端·nestjs