React 基础与核心概念
React 是一个用于构建用户界面的 JavaScript 库,其核心思想是 组件化 和 声明式编程。
1. 虚拟 DOM (Virtual DOM)
什么是虚拟 DOM?
虚拟 DOM 是一个轻量级的 JavaScript 对象,它是真实 DOM 的抽象表示。React 通过维护这样一个对象树来描述 UI 的状态。
javascript
// JSX
const element = <h1 className="greeting">Hello, world!</h1>;
// 编译后的虚拟 DOM 对象 (简化版)
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world!'
}
};为什么需要虚拟 DOM?
- 跨平台能力:虚拟 DOM 只是一个 JS 对象,可以渲染到浏览器 (ReactDOM)、移动端 (ReactNative)、VR 等不同平台。
- 性能优化:通过 Diff 算法比较新旧虚拟 DOM,只更新发生变化的部分,减少昂贵的真实 DOM 操作。
- 声明式 API:让开发者关注状态变化,而不是手动操作 DOM。
2. 合成事件 (Synthetic Events)
React 实现了一套自己的事件系统,称为合成事件。
实现机制
- 事件委托:React 17 之前将所有事件绑定到
document上,React 17 之后绑定到root容器上。 - 统一封装:React 将浏览器原生事件封装为
SyntheticEvent,抹平了不同浏览器的兼容性差异。
为什么要使用合成事件?
- 跨浏览器兼容:解决 IE 等浏览器的兼容性问题。
- 性能优化:利用事件委托,减少内存消耗(不需要为每个 DOM 节点绑定事件监听器)。
- 与虚拟 DOM 结合:方便在组件销毁时统一移除事件监听,防止内存泄漏。
3. 类组件 vs 函数组件
类组件 (Class Component)
- 基于 ES6 Class。
- 有
this指向。 - 有生命周期方法 (
componentDidMount等)。 - 状态管理通过
this.state和this.setState。
函数组件 (Function Component)
- 只是一个普通函数。
- 没有
this。 - 没有生命周期方法(使用 Hooks 模拟)。
- 捕获特性 (Capture Value):函数组件每次渲染都会创建新的闭包,捕获当前渲染时的 props 和 state。
面试题:类组件和函数组件的区别?
- 心智模型:类组件是面向对象的,关注实例;函数组件是函数式的,关注输入输出。
- 状态逻辑复用:函数组件通过 Hooks 复用逻辑更简单(自定义 Hooks),类组件需要 HOC 或 Render Props,容易导致嵌套地狱。
- 未来趋势:React 官方推荐使用函数组件 + Hooks。
4. 框架 vs 原生 DOM
框架相比于原生解决了什么问题?
- 开发效率:组件化开发,代码复用率高。
- 可维护性:声明式编程,代码逻辑更清晰。
- 性能保障:虽然直接操作 DOM 可能更快,但框架通过虚拟 DOM 和 Diff 算法,保证了在大多数场景下的性能下限,避免了低效的手动 DOM 操作。
- 跨平台:一次学习,多端编写 (React Native)。
5. JSX 的本质
JSX 仅仅是 React.createElement(component, props, ...children) 的语法糖。
javascript
// JSX
<MyButton color="blue" shadowSize={2}>
Click Me
</MyButton>
// 编译后
React.createElement(
MyButton,
{color: 'blue', shadowSize: 2},
'Click Me'
)