第9章 React介绍与JSX

现代前端框架入门,组件化开发的第一步

作者:zyyc-0336  |  日期:2026-06-12

9.1.1 什么是 React

React 是 Facebook(现 Meta)开发的一个前端 UI 库,用"组件"的方式来构建网页。

三个核心概念

概念大白话
组件化把页面拆成一块一块的"积木",每块积木就是一个组件
声明式你告诉 React "我想要什么样子",它自动帮你实现
虚拟 DOMReact 在内存里维护一个"虚拟页面",只更新变化的部分,速度很快

传统开发 vs React 开发

对比传统方式React 方式
页面更新手动操作 DOM(getElementById、innerHTML)修改数据,React 自动更新页面
代码组织按文件类型分(HTML/CSS/JS 分开)按功能分(一个组件包含自己的 HTML+JS+样式)
复用复制粘贴代码把组件当积木,拿来就用

创建 React 项目

使用 Vite(比官方的 create-react-app 更快):

bash
# 创建项目(用 Vite)
npm create vite@latest my-blog -- --template react

# 进入项目
cd my-blog

# 安装依赖
npm install

# 启动开发服务器
npm run dev
💡 Vite 是一个前端构建工具,帮你快速创建和运行 React 项目。npm run dev 启动后,浏览器打开 http://localhost:5173 就能看到页面。

9.1.2 JSX 语法

JSX(JavaScript XML)是 React 中用来描述界面的"模板语言"。它看起来像 HTML,但本质上是 JavaScript。

JSX 的基本规则

jsx
// JSX 可以像 HTML 一样写标签
let element = <h1>你好,世界!</h1>;

// JSX 里用 {} 嵌入 JavaScript 表达式(类似模板字符串的 ${})
let name = '小明';
let element2 = <h1>你好,{name}!</h1>;

// JSX 里可以用 {} 嵌入任何 JS 表达式
let element3 = <p>1 + 1 = {1 + 1}</p>;

JSX vs HTML 的区别

特性HTMLJSX
classclass="box"className="box"
forfor="input"htmlFor="input"
stylestyle="color:red"style={{ color: 'red' }}
自闭合<img> 可以不闭合<img /> 必须闭合
根元素可以有多个根元素必须有一个根元素
📝 完整 JSX 示例代码
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>JSX 示例</title>
</head>
<body>
    <div id="root"></div>
    <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

    <script type="text/babel">
        // 1. JSX 里嵌入变量
        let title = '我的博客';
        let author = '小明';
        let isPublished = true;

        // 2. JSX 里嵌入表达式
        let postCount = 10;
        let greeting = <h1>{title} — 已发布 {postCount} 篇文章</h1>;

        // 3. JSX 里的 style 是对象(双花括号)
        let cardStyle = {
            backgroundColor: '#f5f5f5',
            padding: '20px',
            borderRadius: '8px',
            marginTop: '10px'
        };

        // 4. JSX 里的 className(不是 class)
        let App = () => {
            return (
                <div className="app">
                    {greeting}
                    <p>作者:{author}</p>
                    <p>状态:{isPublished ? '已发布' : '草稿'}</p>
                    <div style={cardStyle}>
                        <h2>JavaScript 入门</h2>
                        <p>零基础学习 JavaScript 的基础语法...</p>
                    </div>
                </div>
            );
        };

        // 渲染到页面
        ReactDOM.createRoot(document.getElementById('root')).render(<App />);
    </script>
</body>
</html>

代码逐行讲解

代码说明
let title = '我的博客'定义变量
<h1>{title}</h1>在 JSX 里用 {} 插入变量
{isPublished ? '已发布' : '草稿'}{} 里可以写三元表达式
style={{ backgroundColor: '#f5f5f5' }}style 是 JS 对象,双花括号
className="app"用 className 代替 class
ReactDOM.createRoot(...).render(<App />)把组件渲染到页面上
⚠️ 新手易错{} 里只能放表达式(有返回值的),不能放语句(if、for、while)。{ if (true) { ... } } 会报错。要用三元表达式 { condition ? 'A' : 'B' }

9.1.3 条件渲染

条件渲染就是根据不同条件,显示不同的内容

三种条件渲染方式

📋 三种方式对比
方式适用场景示例
三元 ? :二选一{isPublished ? '已发布' : '草稿'}
&& 短路满足条件才显示{isDraft && <Warning />}
提前 return组件级别判断if (!login) return <Login />
📝 完整条件渲染示例代码
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>条件渲染示例</title>
</head>
<body>
    <div id="root"></div>
    <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

    <script type="text/babel">
        // 方式1:三元表达式
        function PostStatus({ isPublished }) {
            return (
                <p>
                    状态:{isPublished ? '✅ 已发布' : '📝 草稿'}
                </p>
            );
        }

        // 方式2:&& 短路(满足条件才显示)
        function PostWarning({ isDraft }) {
            return (
                <div>
                    {isDraft && <p style={{ color: 'orange' }}>⚠️ 这是草稿,仅自己可见</p>}
                </div>
            );
        }

        // 方式3:提前 return(组件级别)
        function LoginPrompt({ isLoggedIn }) {
            if (!isLoggedIn) {
                return <p>请先登录后再查看文章</p>;
            }
            return <p>欢迎回来,你有 3 篇未读文章</p>;
        }

        // 组合使用
        function App() {
            let isLoggedIn = true;
            let isPublished = false;

            return (
                <div>
                    <h1>条件渲染示例</h1>
                    <PostStatus isPublished={isPublished} />
                    <PostWarning isDraft={!isPublished} />
                    <LoginPrompt isLoggedIn={isLoggedIn} />
                </div>
            );
        }

        ReactDOM.createRoot(document.getElementById('root')).render(<App />);
    </script>
</body>
</html>

🖥️ 运行结果

▶ Console Output
条件渲染示例
状态:📝 草稿
⚠️ 这是草稿,仅自己可见
欢迎回来,你有 3 篇未读文章

9.1.4 列表渲染

列表渲染就是把数组里的数据变成一组 HTML 元素。用 map() 方法把数据数组"映射"成 JSX 数组。

📝 完整列表渲染示例代码
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>列表渲染示例</title>
</head>
<body>
    <div id="root"></div>
    <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

    <script type="text/babel">
        // 文章卡片组件
        function PostCard({ title, author, date, excerpt }) {
            return (
                <div style={{
                    border: '1px solid #ddd',
                    borderRadius: '8px',
                    padding: '16px',
                    marginBottom: '12px'
                }}>
                    <h2 style={{ marginTop: 0 }}>{title}</h2>
                    <p style={{ color: '#666', fontSize: '14px' }}>
                        作者:{author} | 日期:{date}
                    </p>
                    <p>{excerpt}</p>
                </div>
            );
        }

        function App() {
            // 文章数据(数组)
            let posts = [
                {
                    id: 1,
                    title: 'JavaScript 入门指南',
                    author: '小明',
                    date: '2026-06-01',
                    excerpt: '零基础学习 JavaScript 的基础语法...'
                },
                {
                    id: 2,
                    title: 'CSS 布局技巧',
                    author: '小红',
                    date: '2026-06-05',
                    excerpt: 'Flex 和 Grid 布局完全指南...'
                },
                {
                    id: 3,
                    title: 'React 快速上手',
                    author: '小明',
                    date: '2026-06-10',
                    excerpt: '用组件化的方式构建用户界面...'
                }
            ];

            return (
                <div style={{ maxWidth: '600px', margin: '0 auto', padding: '20px' }}>
                    <h1>文章列表</h1>
                    <p>共 {posts.length} 篇文章</p>

                    {/* 用 map 渲染列表,key 必须唯一 */}
                    {posts.map(post => (
                        <PostCard
                            key={post.id}
                            title={post.title}
                            author={post.author}
                            date={post.date}
                            excerpt={post.excerpt}
                        />
                    ))}
                </div>
            );
        }

        ReactDOM.createRoot(document.getElementById('root')).render(<App />);
    </script>
</body>
</html>

🖥️ 运行结果

▶ Console Output
文章列表
共 3 篇文章

┌───────────────────────────────────┐
│ JavaScript 入门指南                │
│ 作者:小明 | 日期:2026-06-01      │
│ 零基础学习 JavaScript 的基础语法... │
└───────────────────────────────────┘
┌───────────────────────────────────┐
│ CSS 布局技巧                       │
│ 作者:小红 | 日期:2026-06-05      │
│ Flex 和 Grid 布局完全指南...       │
└───────────────────────────────────┘
┌───────────────────────────────────┐
│ React 快速上手                     │
│ 作者:小明 | 日期:2026-06-10      │
│ 用组件化的方式构建用户界面...       │
└───────────────────────────────────┘

关于 key

key 是 React 用来识别哪个元素是哪个的标记。就像每个人都有身份证号,React 靠 key 来高效更新列表。

jsx
// ✅ 用唯一 id 作为 key
{posts.map(post => <PostCard key={post.id} {...post} />)}

// ❌ 不要用下标作为 key(数据顺序变化时会出问题)
{posts.map((post, index) => <PostCard key={index} {...post} />)}
⚠️ 新手易错key 必须放在 map最外层元素上,不能放在组件内部。
⚠️ 新手易错key 必须在兄弟元素中唯一,但不需要全局唯一。
⚠️ 新手易错:用 index(下标)做 key 是不推荐的。如果数组会发生排序、插入、删除,用 index 做 key 会导致组件状态错乱。

本章复盘——React 介绍与 JSX 核心要点

要点说明
React 是什么用组件化方式构建 UI 的 JavaScript 库
JSXJavaScript + XML 的混合语法,{} 嵌入表达式
classNameJSX 里用 className 代替 class
style是 JS 对象,双花括号 {{ color: 'red' }}
条件渲染三元 ? :&& 短路、提前 return
列表渲染map() 把数据数组映射成 JSX 数组
key列表元素必须有唯一 key,推荐用数据 id

下一章预告(第10章):我们将学习组件与 Props——函数组件的定义、Props 传递、默认值和 children 的使用。

本文档由 zyyc-0336 编写,最后更新:2026-06-14