定义
UI=f(state)说明了React的核心:用户界面是应用状态的纯函数的映射结果
- state:单一数据源,驱动UI变化的唯一事实来源。
- f:函数(组件),根据state和props返回UI描述
- UI:虚拟DOM,对UI的一种轻量级描述
声明式编程
一、定义
1. React:声明式编程(Declarative Programming)
声明式编程的核心是 “告诉程序「要什么」(What),而不关心「怎么做」(How)”。
在 React 中,你只需要描述 UI 与状态(state/props)的映射关系(即声明“当状态为 X 时,UI 应该是 Y 样子”),至于如何创建 DOM、如何更新 DOM、如何对比 DOM 差异,完全由 React 内部(虚拟 DOM、Diff 算法等)自动处理,开发者无需关心底层实现细节。
2. jQuery:命令式编程(Imperative Programming)
命令式编程的核心是 “告诉程序「怎么做」(How),一步步指导程序完成任务”。 在 jQuery 中,你需要手动编写每一步操作的指令,精确控制 DOM 的创建、修改、删除和更新流程,相当于“手把手”指挥程序完成 UI 渲染和交互逻辑。
二、React 声明式 vs jQuery 命令式:核心区别
jQuery 代码的特点:每一步都需要开发者明确指令,从 DOM 获取 → 初始渲染 → 事件绑定 → 数据修改 → DOM 更新,全程手动控制“怎么做”。
React 代码的特点:开发者只需要声明“状态是什么”“UI 与状态的对应关系”“点击按钮要修改状态”,至于 DOM 渲染、事件绑定、状态变化后的 DOM 更新,全部由 React 自动完成。
核心区别总结表
| 对比维度 | React(声明式编程) | jQuery(命令式编程) |
|---|---|---|
| 核心思想 | 告诉程序「要什么」,描述 UI 与状态的映射 | 告诉程序「怎么做」,编写分步执行的指令 |
| DOM 操作 | 无需手动操作 DOM(React 内部封装处理) | 手动操作 DOM(获取、创建、修改、删除等) |
| 关注重点 | 关注“UI 结果”,不关心底层实现 | 关注“执行步骤”,需精确控制每一个操作流程 |
| 状态与 UI 关联 | 状态是 UI 的唯一数据源,自动同步(UI=f(state)) | 状态与 UI 手动关联,需手动同步二者变化 |
| 逻辑耦合度 | 组件化封装,UI 与逻辑低耦合 | DOM 操作与业务逻辑高度耦合 |
三、React 声明式编程相对 jQuery 命令式编程的核心优势
1. 代码更简洁,开发效率更高
开发者无需编写大量手动操作 DOM 的指令(如 jQuery 中的 $('#id')、.text()、.html()、.on() 等),只需专注于业务逻辑(状态管理)和 UI 描述(JSX),大幅减少代码量,降低开发成本,提升开发效率。
比如实现“列表渲染并根据状态高亮选中项”:
- jQuery 需手动创建
<li>元素、循环插入 DOM、手动判断选中状态并添加样式、选中变化时再手动修改样式; - React 只需声明“列表数据为
list,选中项为activeId,当item.id === activeId时添加高亮样式”,其余由 React 自动处理。
2. 可预测性更强,更易调试和维护
React 遵循 UI = f(state),状态与 UI 是单向依赖关系:
- 只要状态确定,UI 就一定是确定的,不存在“状态正确但 UI 异常”的情况;
- 当 UI 出现问题时,只需追溯状态的变化路径(谁修改了状态、何时修改的),无需排查大量手动 DOM 操作代码;
- 而 jQuery 中,状态与 UI 是分离的,可能出现“数据改了但 DOM 没更”“手动改了 DOM 但数据没同步”的混乱场景,调试时需要逐行排查 DOM 操作指令,维护成本极高(尤其在大型项目中)。
3. 组件复用性更强,更适合大型项目
React 的声明式编程与组件化天然契合,组件是纯函数化的(输入 props/state 相同,输出 UI 相同),不依赖外部 DOM 或全局变量,可在任意场景下复用。
比如一个 Button 组件,只需通过 props 声明按钮类型、禁用状态、点击回调,就能在项目各处复用;而 jQuery 中,DOM 操作与业务逻辑耦合,若要复用某个功能,需要复制大量 DOM 操作代码,难以实现优雅的复用。
4. 自动优化 DOM 操作,性能更优
jQuery 中,开发者手动修改 DOM 时,往往会频繁操作真实 DOM(如循环插入节点、多次修改元素样式),而真实 DOM 操作是浏览器性能瓶颈之一。
React 内部通过 虚拟 DOM 和 Diff 算法 自动优化 DOM 操作:
- 状态变化时,React 先创建虚拟 DOM(内存中的 JS 对象),对比新旧虚拟 DOM 的差异;
- 只将“变化的部分”同步到真实 DOM 中,避免了大量无效的真实 DOM 操作;
- 开发者无需关心如何优化 DOM 操作,React 已内置最优方案,相比 jQuery 手动优化更简单、更高效。