说说对 React 的理解?有哪些特性?
问题解析(面试官考察点)
面试官通过此问题主要考察:
- 对 React 本质的理解程度
- 是否了解 React 的核心设计理念
- 对 React 核心特性的掌握情况
- 能否清晰阐述 React 与其他框架的区别
核心概念(基础知识点)
什么是 React
React 是用于构建用户界面的 JavaScript 库,只提供了 UI 层面的解决方案:
- 组件设计模式:将界面拆分成独立、可复用的小块
- 声明式编程:关注"做什么"而非"如何做"
- 函数式编程概念:使前端应用程序更高效
- 虚拟 DOM:有效地操作 DOM
- 单向数据流:从高阶组件到低阶组件的数据传递
React 的核心特性
- JSX 语法:JavaScript 的语法扩展,允许在 JS 中编写类似 HTML 的结构
- 单向数据绑定:数据只能从父组件流向子组件
- 虚拟 DOM:内存中的 DOM 表示,提高渲染性能
- 声明式编程:描述 UI 应该是什么样子,而非如何到达该状态
- Component(组件化):一切皆为组件,组件可组合、嵌套
详细解答(代码示例)
基础组件示例
// 类组件
class HelloMessage extends React.Component {
render() {
return <div>Hello {this.props.name}</div>;
}
}
ReactDOM.render(
<HelloMessage name="Taylor" />,
document.getElementById("hello-example")
);
上述类似 XML 的形式就是 JSX,最终会被 Babel 编译为合法的 JS 语句调用:
// 编译后的代码
React.createElement("div", null, "Hello ", this.props.name);
声明式编程示例
命令式编程(传统方式):
// 创建地图
const map = new Map.map(document.getElementById("map"), {
zoom: 4,
center: { lat, lng },
});
// 创建标记
const marker = new Map.marker({
position: { lat, lng },
title: "Hello Marker",
});
// 地图上添加标记
marker.setMap(map);
声明式编程(React 方式):
<Map zoom={4} center={(lat, lng)}>
<Marker position={(lat, lng)} title={"Hello Marker"} />
</Map>
函数组件与类组件示例
// 函数组件
const Header = () => {
return (
<Jumbotron style={{ backgroundColor: "orange" }}>
<h1>TODO App</h1>
</Jumbotron>
);
};
// 类组件
class Dashboard extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<div className="dashboard">
<ToDoForm />
<ToDoList />
</div>
);
}
}
深入理解(原理剖析)
组件的特点
一个优秀的 React 组件应具备以下特点:
-
可组合(Composable)
- 每个组件易于和其他组件一起使用
- 可以嵌套在另一个组件内部
-
可重用(Reusable)
- 每个组件都是具有独立功能的
- 可以被使用在多个 UI 场景
-
可维护(Maintainable)
- 每个小的组件仅仅包含自身的逻辑
- 更容易被理解和维护
React 的优势
| 优势 | 说明 |
|---|---|
| 高效灵活 | 虚拟 DOM 减少真实 DOM 操作,提升性能 |
| 声明式设计 | 代码简单,易于理解和维护 |
| 组件式开发 | 提高代码复用率,降低耦合度 |
| 单向数据流 | 比双向绑定更安全,数据流向清晰,便于调试 |
JSX 的工作原理
JSX 不是合法的 JavaScript,需要经过转换:
- 编写阶段:使用 JSX 语法编写组件
- 编译阶段:Babel 将 JSX 转换为
React.createElement()调用 - 执行阶段:
React.createElement()返回 React 元素(描述 UI 的普通对象) - 渲染阶段:React DOM 将 React 元素更新到真实 DOM
// JSX
const element = <h1 className="greeting">Hello, world!</h1>;
// 编译后
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
// 返回的 React 元素
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world!'
}
};
最佳实践
-
组件拆分原则
- 单一职责原则:一个组件只做一件事
- 当组件变得复杂时,考虑拆分成更小的组件
-
Props 设计
- 保持 Props 简单明了
- 使用解构赋值获取 props
-
状态管理
- 尽量使用函数组件 + Hooks
- 状态提升:将共享状态提升到最近的公共父组件
-
性能优化
- 使用 React.memo 避免不必要的重渲染
- 使用 useMemo 和 useCallback 缓存计算结果和回调函数
面试要点
-
React 是库不是框架
- 只关注视图层
- 需要配合其他库(如 React Router、Redux)构建完整应用
-
虚拟 DOM 的优势
- 减少直接操作 DOM 的性能开销
- 跨平台能力(React Native)
- 通过 Diff 算法最小化 DOM 更新
-
单向数据流 vs 双向绑定
- 单向数据流:数据只能从父组件流向子组件
- 优势:数据流向清晰,易于追踪和调试
- 对比 Vue/Angular 的双向绑定
-
常见误区澄清
- JSX 不是模板引擎
- React 不依赖 JSX(可以使用
React.createElement) - 虚拟 DOM 不一定比直接操作 DOM 快(在简单场景下)