React 入门:从 JSX 到组件化,搞定核心知识点 🚀
一、 什么是 React & 为什么选择 React?🎯
如果你问前端圈的程序猿 "现在最火的 UI 库是什么",十有八九会听到 "React" 这个名字。简单来说,React 是 Facebook(现在的 Meta)推出的一个用于构建用户界面的 JavaScript 库,它就像一个超级高效的 "UI 建筑师",让我们能轻松搭建出交互丰富、性能能打的网页。
为什么要学 React 呢?"react 一开始就是组件思想,非常的纯粹"。和传统前端开发相比,React 有三个 "撒手锏":响应式(数据变了 UI 自动更)、数据绑定(数据和 UI 手拉手)、组件化(把页面拆成一块块可复用的 "积木")。虽然有人说它入门门槛比 Vue 高一点,但一旦上手,你会发现这种 "激进" 的设计思路特别适合复杂应用开发,毕竟谁不想写一次代码到处复用呢?
二、 JSX 语法:在 JS 里写 HTML?这操作有点秀!✨
2.1 什么是 JSX?
第一次看到 JSX 代码的同学可能会懵:"这到底是 JS 还是 HTML?" 其实官方解释很直白 ------JSX 就是 "XML in JS" (在 JavaScript 里写 XML),而我们熟悉的 HTML,本质上就是一种特殊的 XML。
看看下面的例子:
jsx
javascript
// JSX写法
const element = <h2>JSX 是 React 中用于描述用户界面的语法扩展</h2>
// 等效的原生JS写法(JSX的编译结果)
const element2 = createElement('h2', null,'JSX 是 React 中用于描述用户界面的语法扩展');
这两行代码效果完全一样,但显然 JSX 版本更像 "人话"。所以说,JSX 本质是createElement函数的语法糖,它的存在就是为了让我们写 UI 时少掉点头发,毕竟谁愿意对着一堆嵌套的函数调用流泪呢?
2.2 JSX 的基本语法
虽然 JSX 看起来像 HTML,但它有几个 "小怪癖" 需要注意:
-
必须有根元素包裹 就像快递必须有包装盒,JSX 返回的内容也得有个 "根容器"。比如下面用
<div>当容器,也可以用 React 提供的<Fragment>(文档碎片)当 "隐形容器",避免多一层不必要的 DOM 节点。jsx
javascript// 正确:有根元素包裹 return ( <div> <h1>title</h1> <p>content</p> </div> ) // 错误:没有根元素 return ( <h1>title</h1> <p>content</p> ) -
class 要写成 className ,如果你在 JSX 里写
<div class="box">,React 会给你抛错 ------ 因为class是 JavaScript 的关键字,所以得改用className。比如:jsx
ini// 正确写法 <span className="title">Hello</span> // 错误写法(会报错) <span class="title">Hello</span> -
表达式要用大括号包起来 想在 JSX 里插入变量或表达式?用
{}就行!比如:jsx
javascriptconst name = "React"; const isLoggedIn = true; // 插入变量 return <h1>Hello {name}!</h1>; // 插入条件表达式 return {isLoggedIn ? <div>已登录</div> : <div>未登录</div>};
三、 组件化:前端开发的 "乐高积木"🧩
3.1 什么是组件?
组件就像网页的 "功能模块"------ 把 HTML、CSS、JS 打包成一个独立单元,完成特定功能。比如下面的JuejinHeader是头部组件,Ariticles是文章列表组件,它们就像乐高积木,拼在一起就成了完整页面。
jsx
javascript
// 头部组件
function JuejinHeader() {
return(
<div>
<header>
<h1>JueJin首页</h1>
</header>
</div>
)
}
// 文章列表组件
const Ariticles = () => {
return(
<div>
Articles
</div>
)
}
3.2 为什么 React 选函数当组件?
React 里的组件大多是函数,这可不是随便选的。函数适合做组件,因为能将 JSX + 逻辑封装成一个组件。想想看,函数接收参数、处理逻辑、返回结果,组件接收数据、处理交互、返回 UI,简直是天造地设!
比如最简化的组件长这样:
jsx
javascript
// 一个简单的签到组件
const Checkin = () => {
return(
<div>Checkin</div>
)
}
一行不多一行不少,逻辑和 UI 完美融合~
3.3 根组件与子组件组合形成组件树
整个 React 应用就像一棵大树,有一个 "根组件",其他组件都是它的 "子组件"。以掘金首页为例展示根组件、子组件以及组件树的知识内容。下面代码的JuejinHeader、Ariticles都是APP的子组件:

jsx
javascript
function JuejinHeader() {
return(
// jsx 最外层
<div>
<header>
<h1>JueJin首页</h1>
</header>
</div>
)
}
const Ariticles = () => {
return(
<div>
Articles
</div>
)
}
const Checkin = () => {
return(
<div>
Checkin
</div>
)
}
const TopArticles = () => {
return(
<div>
TopArticles
</div>
)
}
// 根组件
function APP() {
// 子组件们
return(
<div>
{/* <h1>Hello <b>React!</b></h1> */}
{/* 头部组件 */}
<JuejinHeader />
<main>
{/* 组件也和html 一样声明,自定义组件 */}
{/* 组件化让我们像搭积木一样组合成页面 */}
<Ariticles />
<aside>
<Checkin />
<TopArticles />
</aside>
</main>
</div>
)
}
export default APP
组件树以一个根组件为起点(就像树干),其他组件作为 "子组件"(树枝和树叶)嵌套在其中,形成明确的层级关系。整个 React 应用的 UI 结构,本质上就是一棵组件树的可视化呈现。上面这段代码形成的组件树结构如下:
css
APP(根)
├─ JuejinHeader
└─ main
├─ Ariticles
└─ aside
├─ Checkin
└─ TopArticles
四、 状态:让组件 "动" 起来的魔法📦
4.1 什么是 state 状态?
如果说组件是 "身体",那状态(state)就是 "灵魂"------ 它是组件内部的 "数据仓库",决定了组件的样子和行为。比如用户是否登录、待办事项列表、当前显示的名字,这些都是状态。
4.2 useState:状态管理的 "金钥匙"
React 提供了useState这个钩子函数来管理状态,它的用法就像 "拆盲盒":
jsx
javascript
// 引入useState
import { useState } from 'react';
// 声明状态:初始值为"vue",setName用于更新状态
const [name, setName] = useState("vue");
这几行代码做了三件事:
- 声明了一个叫
name的状态,初始值是 "vue" - 得到一个更新状态的函数
setName - 当
setName被调用时,组件会重新渲染,UI 自动更新
比如 3 秒后更新状态,页面会自动变化:
jsx
scss
// 3秒后将name从"vue"改为"react"
setTimeout(() => {
setName("react");
}, 3000);
效果展示:

4.3 多种状态管理
一个组件可以有多个状态,就像一个人可以有 "姓名""年龄""职业" 多个属性。比如同时管理三个状态:
jsx
php
// 框架名称状态
const [name, setName] = useState("vue");
// 待办事项列表状态
const [todos, setTodos] = useState([
{ id: 1, title: "学习react", done: false },
{ id: 2, title: "学习node", done: false }
]);
// 登录状态
const [isLoggedIn, setIsLonggedIn] = useState(false);
每个状态独立管理,互不干扰,代码逻辑清晰得很~
五、 渲染:让数据 "长" 成 UI 的艺术🖌️
5.1 条件渲染:根据状态 "变魔术"
React 里的条件渲染就像 "if-else" 的可视化版本,jSX中不能直接使用"if-else"语法(因为 JSX 大括号{}内只能放表达式 ,而if else是语句),通常使用三目运算符代替。比如判断待办事项是否为空:
jsx
javascript
// 有数据时显示列表,无数据时显示提示
todos.length > 0 ? (
<ul>
{/* 列表内容 */}
</ul>
) : (
<div>暂无待办事项</div>
)
登录状态的显示也是同理:
jsx
javascript
// 根据登录状态显示不同内容
{isLoggedIn ? <div>已登录</div> : <div>未登录</div>}
5.2 列表渲染:用 map () 批量 "生产" UI
当需要渲染列表(比如待办事项、商品列表)时,map()方法就是神器。比如渲染 todos 列表:
jsx
javascript
<ul>
{
todos.map((todo) => (
// 每个列表项必须有唯一key
<li key={todo.id}>
{todo.title}
</li>
))
}
</ul>
这里有个小细节:每个列表项必须加key属性(通常用唯一 ID),这是 React 的 "性能暗号",帮助它快速识别哪些项没变,避免重复渲染 ------ 不加 key 虽然能运行,但可能会有性能问题哦!
六、 事件处理:给组件 "装开关"🔌
React 里的事件处理就像给组件装开关,点击、输入等操作都会触发对应的函数。语法上有个小特点:事件名要用驼峰命名(比如onClick而不是onclick)。
比如登录按钮的点击事件:
jsx
javascript
// 切换登录状态的函数
const toggleLogin = () => {
setIsLonggedIn(!isLoggedIn);
};
// 按钮绑定点击事件
<button onClick={toggleLogin}>
{isLoggedIn ? "退出登录" : "登录"}
</button>
点击按钮时,toggleLogin函数会切换isLoggedIn状态,按钮文字和登录状态显示会自动更新 ------ 这就是 "数据驱动 UI" 的魅力,我们只需要管数据怎么变,UI 自然会跟上。
七、实战演练-简单的学习任务清单登陆界面
7.1 代码展示:
javascript
// JSX 负责UI
// use 使用
// state 数据状态
import {useState} from 'react';
import './App.css';
function App() {
// const name = "vue";
// useState 会返回一个数组
// 数组的第一个元素是状态值,第二个元素是更新状态值的函数
const [name,setName] = useState("vue");
const [todos, setTodos] = useState([{
id: 1,
title: "学习react",
done: false,
},
{
id: 2,
title: "学习node",
done: false,
}]);
const [isLoggedIn,setIsLonggedIn] = useState(false);
setTimeout(() => {
setName("react");
},3000);
// 组件的数据业务、交互等
// JSX js里面,class 是js 关键字 不能用,用className
const toggleLogin = () => {
setIsLonggedIn(!isLoggedIn);
}
return(
// 文档碎片标签
<div>
<h1>Hello <span className="title">{name}!</span></h1>
{
todos.length > 0 ? (
<ul>
{
todos.map((todo) => (
<li key={todo.id}>
{todo.title}
</li>
))
}
</ul>
) : (<div>暂无待办事项</div>)
}
{isLoggedIn ? <div>已登录</div>:<div>未登录</div>}
<button onClick = {toggleLogin}>
{isLoggedIn?"退出登录":"登录"}
</button>
</div>
)
}
export default App
7.2 项目介绍
这个项目是一个基于 React 的简单示例,主要展示了 React 的核心特性,具体如下:
-
技术基础 :使用 React 框架开发,采用 JSX 语法描述 UI 界面,通过
import引入 React 的useState(状态管理)API。 -
核心功能:
- 动态文本展示:通过
name状态控制标题文本,初始显示 "Hello vue!",3 秒后自动更新为 "Hello react!"。 - 待办事项列表:基于
todos状态渲染待办事项列表,若列表为空则显示 "暂无待办事项"。 - 登录状态切换:通过
isLoggedIn状态管理登录状态,点击按钮可切换 "登录 / 退出登录" 状态,并同步显示对应的状态文本。
- 动态文本展示:通过
-
React 特性体现:
- 状态管理:使用
useState钩子管理组件内部状态(name、todos、isLoggedIn),通过状态更新函数(如setName、setIsLonggedIn)触发 UI 重新渲染。 - 条件渲染:通过三元表达式根据状态(如
todos.length、isLoggedIn)动态展示不同 UI 内容。 - JSX 语法:在 JavaScript 中直接编写类似 HTML 的标签,同时支持嵌入变量(如
{name})和表达式。
- 状态管理:使用
整体是一个用于演示 React 状态与 UI 联动、组件化开发思想的基础示例。
7.3 效果亮个相

八、 总结:React 核心知识清单 & 结语📝
8.1 知识清单
- React 是专注于 UI 的库,核心是组件化和响应式
- JSX 是 "JS 里写 XML" 的语法糖,简化 UI 开发
- 组件是函数,封装 UI 和逻辑,可组合成组件树
- 用
useState管理状态,状态变则 UI 变 - 条件渲染用三目运算符,列表渲染用
map()+key - 事件处理用驼峰命名,绑定函数操作状态
8.2 结语
学 React 就像学搭积木 ------ 一开始可能觉得 "这零件怎么拼",但掌握了 JSX、组件、状态这些 "基础块" 后,你会发现再复杂的页面也能一步步搭出来。
React 更加激进,但这种激进恰恰让它成为前端开发的 "瑞士军刀"------ 无论是小应用还是大型项目,都能应对自如。现在,你已经掌握了 React 的核心概念,接下来就动手写写代码吧,毕竟实践才是最好的老师!💪