1 React库(人话详解版)
别慌,React 刚接触时是会有点懵,咱们用 "人话 + 类比" 一步步拆:
核心概念先抓牢
-
组件(Component)
把它想成 "乐高积木",比如做个社交 App,顶部导航是一块积木(Navbar 组件)、发的帖子是另一块(Post 组件)。整个 App 就是这些积木拼起来的,每个组件单独存一个文件,好管理。
-
属性(Props)
这是组件的 "配置参数"。比如你做个按钮组件
<Button text="点击我" />
,text
就是 props,父组件传给子组件用的,子组件只能读、不能改(像游戏里固定的初始装备)。 -
状态(State)
组件自己的 "可变数据"。比如点赞按钮,点一下数字 + 1,这个点赞数就是 state,组件内部能改(用
useState
声明,像const [count, setCount] = useState(0)
,count
是当前数,setCount
用来改它)。 -
副作用(useEffect)
处理 "组件渲染之外的事儿",比如加载数据、订阅事件。比如组件一加载,就去服务器拿用户信息,用
useEffect
写:
jsx
javascript
useEffect(() => {
fetch('/api/user')
.then(res => res.json())
.then(data => setUser(data))
}, []) // 空数组意思是 "只在组件第一次渲染时执行"
举个小例子串起来
假设做个 "点赞卡片" 组件:
jsx
javascript
import React, { useState } from 'react';
// 子组件:点赞按钮(用 props 接收父组件的初始点赞数)
const LikeButton = ({ initialCount }) => {
// 用 state 存实时点赞数
const [count, setCount] = useState(initialCount);
// 点击事件:改 state
const handleLike = () => {
setCount(count + 1);
};
return (
<button onClick={handleLike}>
点赞啦!当前 {count} 个赞
</button>
);
};
// 父组件:卡片(给子组件传 props)
const PostCard = () => {
return (
<div>
<h2>今日分享</h2>
<p>React 其实很好玩~</p>
{/* 把初始点赞数 0 传给子组件 */}
<LikeButton initialCount={0} />
</div>
);
};
export default PostCard;
这里:
PostCard
是父组件,LikeButton
是子组件;initialCount={0}
是父传子的 props;LikeButton
里的count
是自己的 state,点击能变。
router(路由)简单理解
就是 "网址对应哪个组件"。比如:
- 访问
/
→ 显示首页组件(Home) - 访问
/profile
→ 显示个人主页组件(Profile)
用react-router
写大概这样:
jsx
javascript
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from './Home';
import Profile from './Profile';
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/profile" element={<Profile />} />
</Routes>
</Router>
);
}
这样网址变了,页面自动切换对应的组件。
为啥觉得难?试试这些
- 先跑通小 Demo:找个简单需求(比如做个 todo 列表),用 React 实现,把组件、state、props 练一遍。
- 看官方文档 + 拆例子 :官方文档的 "入门教程" 很直观,跟着做一遍;也可以把别人的小项目(比如 GitHub 搜
react demo
)下载下来,拆组件、看 props/state 怎么传的。 - 别怕重复查: useState、useEffect 这些 Hook 记不住很正常,用多了自然熟,遇到不懂就翻文档或搜 "React xxx 怎么用",慢慢就顺了~
React 核心就是 "组件化 + 状态管理",把这俩吃透,再复杂的项目也能拆成小积木慢慢拼!要是卡在哪一步(比如 useEffect 总写不对、组件传值混乱),直接说,咱们针对性拆 。
2 再梳理 React 知识点文档
一、React 是啥?
简单说,React 就是个帮你做网页前端的 JavaScript 库 ,核心思路是 "组件化" 。你可以把整个网页拆成一个一个小 "组件"(比如 Instagram 页面里的导航栏、帖子卡片、侧边栏这些独立的 "块"),然后像搭积木一样,用这些组件拼出整个 App 。
二、核心概念拆解(结合文档里的例子和类比)
1. 组件(Components)
- 是什么 :你自定义的 "HTML 标签" ,比如
<Navbar />
(导航栏组件 )、<PostCard />
(帖子卡片组件 ),每个组件通常对应一个单独的 JavaScript 文件。 - 怎么用 :大组件里套小组件,像整个 App 是
<App />
组件,它里面又能拆成<Header />
、<MainContent />
、<Footer />
这些子组件,子组件还能继续拆,形成 "组件树"(参考文档最后那个 App 组件树图 )。
2. 属性(Props)
-
是什么 :组件的 "输入参数" ,用来给子组件传数据,子组件只能读,不能改 。比如父组件给子组件传标题:
jsx
javascript// 父组件里用子组件,传 props <ChildComponent title="这是帖子标题" likes={100} />
子组件里就能拿到
props.title
(值是"这是帖子标题"
)、props.likes
(值是100
)用。
3. 状态(State)
-
是什么 :组件自己的 "内部变量" ,能改,改了会让组件重新渲染更新 。用
useState
声明,比如:jsx
javascript// 声明状态:count 是当前值,setCount 是用来改 count 的函数,初始值 0 const [count, setCount] = useState(0);
点个赞、输个搜索关键词,这些会变化的 "动态数据" ,就存在 state 里。
4. 路由(Router)
- 是什么 :帮你管理 "不同网址对应哪个组件" ,让单页应用能像多页网站一样切换页面。比如:
- 访问
https://xxx.com/
→ 显示<Feed />
组件(首页) - 访问
https://xxx.com/profile
→ 显示<Profile />
组件(个人页)
用代码写就是文档里那样,把路径和组件对应起来。
- 访问
5. 副作用(useEffect)
- 是啥场景 :组件渲染完后,想做些 "额外的事儿" ,比如 请求接口拿数据、订阅事件、设置定时器 。因为 React 组件更新时会重新执行代码,直接写在组件里的逻辑可能重复执行,
useEffect
能控制这些逻辑 啥时候执行 。 - 怎么用 :看依赖数组(第二个参数):
useEffect(() => { ... }, [])
:空数组,组件 只在第一次渲染完执行一次 (比如初始化时拿用户信息)。useEffect(() => { ... }, [title, count])
:依赖title
或count
,这俩变了就执行 (比如标题变了,重新请求对应数据)。
6. .then()
是啥(文档里单独讲的)
-
本质 :JavaScript 里处理 "异步操作" 的,比如用
fetch
调接口,接口请求得等一会儿才返回结果,.then()
就是 等异步操作做完,再执行后面的逻辑 。 -
例子 :
jsx
javascript// 调接口,等返回结果后,把数据存到 state 里 fetch('/api/posts') .then(response => response.json()) .then(data => setPosts(data));
这样就能保证拿到接口数据后,再更新组件状态。
三、文档里的代码例子(Example.js) 快速理解
文档里的 Example.js
把上面的概念串起来了,拆解一下:
jsx
javascript
// 1. 引入 React 核心和需要的 Hook(useState、useEffect)
import React, { useState, useEffect } from "react";
// 引入样式和子组件
import "./Example.css";
import ExampleChildComponent from "./ExampleChildComponent.js"
// 2. 定义组件(函数组件),可以接收父组件传的 props
const Example = (props) => {
// 3. 声明 state:
// exampleState1 初始值 "dummy message",setExampleState1 用来改它
const [exampleState1, setExampleState1] = useState("dummy message")
// exampleState2 初始值 0,setExampleState2 用来改它
const [exampleState2, setExampleState2] = useState(0)
// 4. useEffect 做副作用:这里调接口,拿到数据后改 exampleState1
useEffect(() => {
// 调接口(异步),.then() 等接口返回后执行
get("/api/anEndpoint", { param1: "value" }).then((serverResponse) => {
setExampleState1(serverResponse) // 把接口数据存到 state
})
}, []) // 空数组,只执行一次
// 5. 定义一个函数,用来改 state(点按钮时会触发)
const addOneToState2 = () => {
setExampleState2(exampleState2 + 1)
}
// 6. 返回组件的 HTML 结构(JSX)
return (
<div>
{/* 用 props 里的 title */}
<h1 className="headerStyle1">{props.title}</h1>
{/* 渲染子组件,传 props:固定值 10、和 state 关联的 exampleState2 */}
<ExampleChildComponent
exampleProp1={10}
exampleProp2={exampleState2}
/>
{/* 点击按钮,执行 addOneToState2 改 state */}
<button onClick={addOneToState2} />
</div>
);
}
// 7. 导出组件,让其他组件能引入使用
export default Example;
这里用到了 组件、props(父传子)、state(组件内部状态)、useEffect(调接口) ,把核心流程走了一遍。
四、FAQ 里的关键问答(帮你区分易混点)
-
State 和 Props 有啥区别?
- Props 是 父组件传的、只读 ,像 "配置参数" ,子组件不能自己改;
- State 是 组件自己的、可修改 ,改了会触发组件重新渲染,像 "动态数据" 。
类比:Props 是父母给孩子的 "零花钱(固定数,孩子不能自己改数)" ;State 是孩子自己的 "储蓄罐(想存想取自己定)" 。
-
文件太多咋管理?
记住 "组件树" !整个 App 是根组件,往下拆成各种子组件,每个组件对应一个文件。心里有这个树状结构,就知道哪个文件是干啥的、数据咋传的了(参考文档最后那个 App 组件树图 )。
五、总结一下学习路径
- 先抓核心概念:组件、Props、State 是基础,把这仨吃透,React 就入门了。
- 练小例子:从做个按钮点击计数、调接口渲染列表开始,把概念用起来。
- 看文档 + 模仿项目:官方文档的 "入门示例" 跟着做,再找简单的 React 项目(比如 GitHub 搜小 Demo ),拆组件、看逻辑咋写的。
刚开始头大正常,多练几遍、遇到问题拆分概念找对应,慢慢就顺了!要是哪个点还卡,随时拆 。
3 jsx和html通常是不是看成是一样的?(答:建议先把 JSX 当成 "特殊的 JS 写法",别和 HTML 混为一谈)
JSX 和 HTML 虽然看起来很像,但本质上是不同的东西,理解它们的区别对写 React 很关键。我用大白话 + 例子帮你拆:
核心区别:JSX 是 JavaScript,HTML 是标记语言
-
HTML
-
是网页的 "骨架",由浏览器解析,比如: html
预览
html<div class="container"> <h1>Hello World</h1> <button onclick="alert('Hi')">Click me</button> </div>
-
-
JSX
-
是 JavaScript 的语法扩展 (可以理解成 "带 HTML 语法的 JS"),最终会被编译成纯 JS 代码,比如:
jsx
javascript// JSX 代码 const element = ( <div className="container"> <h1>Hello World</h1> <Button onClick={() => alert('Hi')} /> </div> ); // 编译后等价的 JS 代码(用 React.createElement) const element = React.createElement( "div", { className: "container" }, React.createElement("h1", null, "Hello World"), React.createElement(Button, { onClick: () => alert('Hi') }) );
-
写法上的 4 个主要差异
1. 属性名不同
- HTML :用小写或连字符(
class
,onclick
) - JSX :用驼峰命名(
className
,onClick
)
jsx
javascript
// HTML
<div class="box" onclick="handleClick()">...</div>
// JSX
<div className="box" onClick={handleClick}>...</div>
2. 插入表达式不同
- HTML:不能直接插 JS 表达式
- JSX :用
{}
插任何 JS 表达式(变量、函数调用、计算等)
jsx
javascript
// JSX 里插入变量或计算
const name = "Alice";
<h1>Hello, {name.toUpperCase()}!</h1> // 输出 "Hello, ALICE!"
3. 自闭和标签
- HTML :部分标签可省略闭合(如
<input>
,<br>
) - JSX :所有标签必须闭合!
jsx
javascript
// HTML
<input type="text">
<br>
// JSX(必须闭合)
<input type="text" />
<br />
4. 必须有一个根元素
- HTML:可以有多个并列标签
- JSX :必须用一个标签包裹所有内容(或用
<>...</>
片段)
jsx
javascript
// 错误:JSX 必须有根元素
return (
<h1>标题</h1>
<p>内容</p>
);
// 正确:用一个 div 包裹
return (
<div>
<h1>标题</h1>
<p>内容</p>
</div>
);
// 或者用空标签(片段)
return (
<>
<h1>标题</h1>
<p>内容</p>
</>
);
为什么 JSX 要设计成这样?
- 核心目的:让你在 JS 里更直观地写 UI
React 的理念是 "UI = f (state)"(UI 是状态的函数),JSX 让你在 JS 代码里自然地描述 UI,而不是把 HTML 和 JS 分开写(比如传统的 DOM 操作)。 - 编译时优化
JSX 编译后是React.createElement
,React 能提前分析和优化组件结构。
常见误区纠正
-
JSX 不是模板语言
模板语言(如 Vue 的模板)是 "HTML 里插 JS",而 JSX 是 "JS 里插 HTML",本质是 JS。
-
JSX 必须引入 React
因为 JSX 会编译成
React.createElement
,所以即使你没显式用React
,也得import React from 'react'
(React 17+ 后可以省略)。 -
JSX 里的逻辑更灵活
比如条件渲染、循环:
jsx
javascript// 条件渲染 {isLoggedIn ? <UserProfile /> : <LoginButton />} // 循环渲染列表 {items.map(item => ( <div key={item.id}>{item.name}</div> ))}
总结:一句话区分
- HTML:是给浏览器看的标记语言。
- JSX:是给开发者看的 "语法糖",最终会变成纯 JS 代码。
刚开始写 React 时,建议先把 JSX 当成 "特殊的 JS 写法",别和 HTML 混为一谈。多写几个组件,自然就习惯了!
4 React 组件编写的知识点总结
Recap: Writing Components
总结 "怎么拆分、写组件" 的基础规则:
- 组件拆分 :把 App 拆成多个组件,每个组件单独放一个文件(方便管理,像搭积木一样)。
- 组件本质 :每个组件是 "接收 props 当输入,返回 JSX(长得像 HTML 的代码)" 的函数。
- JSX 语法 :
- 用
()
包裹多行 JSX,让代码进入 "JSX 环境"(写法规范,避免歧义)。 - 在 JSX 里,用
{}
临时切回 "JS 环境",可以写变量、表达式(比如{props.name}
插变量)。
- 用
总结 "组件传值、状态、样式" 的关键细节:
- 传 props :父组件用
<Post text="I love weblab" />
这种方式,给子组件传数据(text
就是 props)。 - 读 props :子组件里用
props.text
拿到父组件传的值。 - 声明 state :用
useState
存组件的 "可变数据",格式是const [something, setSomething] = useState(initialValue)
(something
是当前值,setSomething
是改它的函数)。 - 样式写法 :React 里给元素加 CSS 类名,用
className
代替 HTML 里的class
(因为class
在 JS 里是关键字,冲突啦)。
一句话总结
这两页是老师带着复习 "React 组件怎么拆分、怎么传值、怎么写状态和样式" 的核心规则,把写组件的基础流程和语法细节串了一遍~ 刚开始记不住没关系,多写几个组件(比如做个按钮、卡片组件),这些规则自然就熟啦!