React 学习 Day1:基础语法与整体框架(含 JS 关键基础)
这一天的核心目标:建立对 React 的整体认识,并补齐编写 React 所必需的 JavaScript 语法基础。下面按知识模块做系统化回顾,并在原笔记基础上补充更多细节、例子与易错点。
1. React 是什么(宏观理解)
- React 是一个用于构建用户界面(UI)的 JavaScript 库,重点负责视图层(View Layer)。
- React 的编程范式是声明式(Declarative):你只描述“界面应该长什么样”,React 负责“怎么更新到页面上”。
- React 生态下通常构建单页应用(SPA):页面不整页刷新,通过路由切换视图。
对 Python 思维的类比:
- React 组件 ≈ Python 的函数/类,用来封装一段可复用的 UI 与逻辑。
- Props ≈ 函数参数(外部输入)。
- State ≈ 函数内部的可变局部状态/类的实例属性(内部数据)。
2. React 核心思想:组件化(Component-Based)
2.1 什么是组件
- React 应用由组件树组成:小组件组合成大组件,最终拼成页面。
- 组件负责一小块 UI + 相关逻辑,具有高复用性与可维护性。
函数组件(现代主流):
function Hello({ name }) { return <h1>Hello {name}</h1>;}组件组合(Composition):
function App() { return ( <div> <Hello name="Tom" /> <Hello name="Jerry" /> </div> );}2.2 函数组件 vs 类组件(只要知道差异)
- 函数组件:更简洁,配合 Hooks 写法统一,是现在 React 的标准。
- 类组件:历史遗留写法,需要
this,生命周期冗长,新项目基本不再推荐。
你现在只需要专注函数组件 + Hooks。
3. React 的三大核心机制
3.1 虚拟 DOM(Virtual DOM)与 Diff
为什么需要 Virtual DOM:
- 真实 DOM 操作成本高。
- React 先在内存里构建虚拟 DOM(JS 对象树),再与旧树比较(diff),只把最小改动同步到真实 DOM。
更新流程:
- State/Props 变化
- 组件重新执行 → 生成新的 Virtual DOM
- React diff 旧树和新树
- 只更新需要变化的真实 DOM
与列表渲染强相关的点:
map渲染列表时要加key,否则 diff 难以稳定复用节点。
items.map(item => <li key={item.id}>{item.title}</li>)key 要稳定且唯一,尽量不用 index 作为 key(数据会增删/重排时会出 bug)。
3.2 Props 与 State
Props(外部传入)
- 父组件 → 子组件的只读数据。
- 子组件不能直接修改 props,只能通过回调通知父组件。
State(组件内部)
- 组件自己维护的可变数据,变化会触发重渲染。
- 使用
useState等 Hook 管理。
单向数据流(React 的基本原则):
- 数据自顶向下传递(parent → child)。
- 子组件想影响父组件:通过 props 传函数(回调),由父组件更新自己的 state。
状态提升(Lifting State Up):
- 当多个组件需要共享同一份数据,把 state 放到它们最近的共同父组件中。
3.3 Hooks(函数组件的“外挂能力”)
常用三件套:
useState:组件状态useEffect:副作用(请求/订阅/手动 DOM 操作)useContext:跨组件共享数据
Hooks 两条硬规则:
- 只能在函数组件或自定义 Hook 顶层调用(不能写在 if/for/函数里)。
- 不能在普通 JS 函数里调用。
4. React 项目启动与目录结构(以 Vite 为例)
初始化项目:
npm create vite@latest my-app --template react典型结构:
src/ main.jsx # 入口:把 React 挂到 DOM App.jsx # 根组件:组织页面结构 assets/ # 静态资源index.html # 页面模板,提供 root 节点main.jsx 的作用:
import ReactDOM from "react-dom/client";import App from "./App.jsx";
ReactDOM.createRoot(document.getElementById("root")).render(<App />);createRoot(...).render(...)相当于“启动 React 应用”。- React 会从
App作为根节点往下渲染整棵组件树。
5. React 常见生态模块(知道用途即可)
5.1 路由(React Router)
用于 SPA 的页面切换:
import { BrowserRouter, Routes, Route } from "react-router-dom";核心概念:
BrowserRouter:路由容器Routes/Route:路由表Link:无刷新跳转
5.2 全局状态管理(Redux / Zustand)
什么时候需要全局状态:
- 多个无关组件都要用/改同一份数据(例如用户信息、主题、购物车)。
对比:
- Redux:强规范、生态大,但模板代码多。
- Zustand:轻量直观,新手上手更快。
5.3 UI 组件库 / 样式方案
- Ant Design / Material UI / Chakra UI:现成高质量组件,提高开发效率。
- Tailwind CSS:原子化/工具类 CSS,快速拼 UI。
6. React 应用的运行与更新流程
整体心智模型:
用户交互 → 触发事件 → setState 更新状态 → 组件重渲染 → Virtual DOM diff → 更新真实 DOM → UI 刷新你在写什么:
- 组件(UI 结构)
- 状态(数据)
- 事件(交互)
- 渲染(JSX 表达 UI)
React 自动帮你做什么:
- 数据变化驱动 UI 更新
- DOM 最小化更新与性能优化
7. JavaScript 基础(React 必备子集)
7.1 let / const / var
const:默认使用,引用不可重新指向。let:需要重新赋值时用。var:不要用(函数作用域、变量提升问题)。
7.2 常用数据类型
- 字符串、数字、布尔值
- 数组:
[1, 2, 3] - 对象:
{ name: "Tom", age: 20 }
重点:数组/对象是引用类型,更新时要注意“不可变性”。
7.3 函数与箭头函数
React 中大量使用箭头函数:
const add = (a, b) => a + b;特点:
- 写法短
this绑定更直观(函数内this取外层)
7.4 条件与 JSX 条件渲染
JS:
if (x > 0) console.log("ok");JSX 常用:
{isLogin ? <User /> : <Login />}{list.length > 0 && <List />}7.5 map(列表渲染核心)
map:把数组映射成新数组,不改变原数组。
const nums = [1, 2, 3];const squares = nums.map(n => n * n); // [1,4,9]React 列表渲染:
<ul> {names.map(name => ( <li key={name}>{name}</li> ))}</ul>7.6 解构(Destructuring)
对象解构:
const user = { name: "Tom", age: 20 };const { name, age } = user;数组解构:
const nums = [1, 2, 3];const [a, b] = nums; // a=1, b=2React 里 useState 就是数组解构:
const [count, setCount] = useState(0);7.7 展开运算符(…)与不可变更新
数组更新:
const arr2 = [...arr1, newItem];对象更新:
const newUser = { ...user, age: 21 };原因:React 依赖“引用变化”判断更新,因此要返回新对象/新数组。
7.8 模块化 import / export
命名导出(named export):
export function add(a, b) { return a + b; }// 使用import { add } from "./utils";默认导出(default export):
export default function App() {}// 使用import App from "./App";export 的使用场景:
- 让其他文件/组件能复用你写的函数、组件、常量、Hook 等。
7.9 Promise 与 async/await
Promise 写法:
fetch(url).then(r => r.json()).then(data => setList(data));async/await 写法:
async function getData() { const r = await fetch(url); const data = await r.json(); setList(data);}React 中常在 useEffect 里请求数据,并用 try/catch 做错误处理。
8. day1 的重点 Q&A 再巩固
8.1 Counter 例子为什么这样写
const [count, setCount] = useState(0);useState 返回 [当前值, 更新函数],用数组解构取出:
count:当前值setCount:更新值并触发重渲染
点击按钮执行:
onClick={() => setCount(count + 1)}→ 更新 state → React 自动重渲染 → UI 变动。
8.2 map 的本质
- 对每个元素执行回调函数
- 返回新数组
- 在 React 中用于“数组 → 组件列表”的转换
8.3 数组解构例子
const nums = [1, 2, 3];const [a, b] = nums;等价于:
const a = nums[0]; // 1const b = nums[1]; // 28.4 export 给谁用
你写的内容需要跨文件复用时导出:
- 组件
- 工具函数
- 常量/配置
- API 封装
- 自定义 Hook
9. 学习路径(下一步怎么走)
- 把 JS 必备子集练熟:
const/let、箭头函数、解构、展开、map、模块化、异步。 - 深入 React 核心:组件写法、props/state、
useState/useEffect、列表/条件渲染。 - 做小项目巩固:Todo List / 个人博客前端 / 管理后台等。
只要把今天这些“最小必备知识”真正用起来,你就能开始写 React 项目了。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!














