React 学习 Day1:基础语法与整体框架(含 JS 关键基础)

1927 字
10 分钟
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。

更新流程:

  1. State/Props 变化
  2. 组件重新执行 → 生成新的 Virtual DOM
  3. React diff 旧树和新树
  4. 只更新需要变化的真实 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 两条硬规则:

  1. 只能在函数组件或自定义 Hook 顶层调用(不能写在 if/for/函数里)。
  2. 不能在普通 JS 函数里调用。

4. React 项目启动与目录结构(以 Vite 为例)#

初始化项目:

Terminal window
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=2

React 里 useState 就是数组解构:

const [count, setCount] = useState(0);

7.7 展开运算符(…)与不可变更新#

数组更新:

const arr2 = [...arr1, newItem];

对象更新:

const newUser = { ...user, age: 21 };

原因:React 依赖“引用变化”判断更新,因此要返回新对象/新数组。

7.8 模块化 import / export#

命名导出(named export):

utils.js
export function add(a, b) { return a + b; }
// 使用
import { add } from "./utils";

默认导出(default export):

App.jsx
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]; // 1
const b = nums[1]; // 2

8.4 export 给谁用#

你写的内容需要跨文件复用时导出:

  • 组件
  • 工具函数
  • 常量/配置
  • API 封装
  • 自定义 Hook

9. 学习路径(下一步怎么走)#

  1. 把 JS 必备子集练熟:const/let、箭头函数、解构、展开、map、模块化、异步。
  2. 深入 React 核心:组件写法、props/state、useState/useEffect、列表/条件渲染。
  3. 做小项目巩固:Todo List / 个人博客前端 / 管理后台等。

只要把今天这些“最小必备知识”真正用起来,你就能开始写 React 项目了。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

React 学习 Day1:基础语法与整体框架(含 JS 关键基础)
https://guoxin.wiki/posts/react-day1-basics/
作者
Guoxin
发布于
2026-10-08
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Guoxin
写代码,也写思考。
公告
博客初建,笔记陆续搬家中。所有文章均经脱敏检查后发布。
分类
标签
最新动态
站点统计
文章
12
分类
6
标签
24
总字数
13,485
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Unknown CI
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录