虚拟 DOM 的原理是什么?为什么比直接操作 DOM 高效?
- 虚拟 DOM 是一个轻量的 JS 对象,用来描述真实 DOM 的层次和属性。
- 通过 Diff 算法最小化 DOM 操作,减少重绘和回流。
JSX 是什么?和普通 JavaScript 的区别?
- JSX 是语法糖,最终会被 Babel 编译为 React.createElement() 调用。
数据流
- 单向数据流,自上而下传递。
- 父组件通过 props 把数据传递给子组件;
- 子组件可以通过回调函数通知父组件。
Props
- PropTypes 定义类型
- defaultProps 定义默认值
- this.props.children 表示组件的所有子节点
- 不要把 props 复制到 state 中,要尽可能把 props 当作数据源(避免反模式)
高阶组件(HOC)
- 用于复用组件逻辑。本质上是一个函数,通过接收一个组件并返回一个新组件
PureComponent 和 React.memo
- PureComponent 会对 props 和 state 进行浅比较
- memo 只对 props 进行浅比较
<Fragment> 和 <> (空标签)的区别
- 只有
<Fragment>可以带 key 属性,这在列表渲染时非常重要
类组件和函数组件的区别?
- 语法与结构
class MyComponent extends React.Component {
render() {
return <div>Hello, {this.props.name}</div>;
}
}
function MyComponent(props) {
return <div>Hello, {props.name}</div>;
}
- 状态管理
- 类组件通过
this.state定义状态,this.setState()更新状态 - 函数组件使用 Hooks 的
useState管理状态 - 生命周期与副作用
- 类组件通过生命周期处理副作用
- 函数组件通过
useEffect替代生命周期 this的绑定问题- 类组件通过手动绑定事件函数的
this
class
Button extends React.Component {
handleClick() { console.log(this); } // this 可能为 undefined
render() {
return <button onClick={this.handleClick.bind(this)}>Click</button>;
}
}
- 函数组件没有 this,直接访问 props 和状态
function Button() {
const handleClick = () => console.log("No this!");
return <button onClick={handleClick}>Click</button>;
}
- 性能优化
- 类组件使用
shouldComponentUpdate或PureComponent避免不必要的渲染 - 函数组件使用
React.memo进行浅比较
【状态管理】
React 中的状态提升(Lifting State Up)是什么?
- 把状态提升到父组件进行管理,子组件通过 props 读取数据。
Context API 的作用?如何避免不必要的渲染?
- Context(上下文) 是 React 提供的跨层级组件数据传递方案,用于解决多层组件嵌套时(逐层传递 props)的问题。
- 核心作用
- 跨组件共享数据(如主题、用户信息、全局配置等)
- 避免中间组件透传 props(减少冗余代码)
MobX / Redux
- 全局状态管理,把状态抽离到组件之外。
Redux
- 工作流程:
- 定义 Store:集中管理全局状态(createStore)。
- 派发 Action:组件通过 dispatch(action) 发出状态修改请求(action 是一个描述“发生了什么”的普通对象)。
- 执行 Reducer:根据 action.type,纯函数 reducer 计算新状态(不可变更新)。
- 更新视图:Store 通知订阅者(如 React 组件),触发重新渲染。
- 核心概念:
- 单向数据流:View → Action → Reducer → Store → View
- 三大原则:单一数据源、状态只读、纯函数修改。
- 总结:
- 组件 dispatch → Reducer 处理 → Store 更新 → 视图同步
MobX
- 工作流程:
- 定义 Observable State:用 @observable 或 makeObservable 标记可变状态。
- 修改 State:在 @action 函数中更新状态(直接赋值/修改对象属性)。
- 自动追踪依赖:组件用 observer 包裹,自动订阅其依赖的状态。
- 触发更新:状态变化时,依赖它的组件自动重渲染。
- 核心概念:
- 响应式编程:像 Excel 公式一样自动更新(无需手动 dispatch/reducer)。
- 直接修改状态(但通过 action 规范变更)。
- 总结:
- 响应式状态,自动追踪依赖,修改即更新
【性能优化】
React 的渲染机制是怎样的?如何避免不必要的渲染?
- 使用 React.memo、useMemo、useCallback、避免内联对象/函数。
React 的 key 属性有什么作用?
- 帮助 React 识别元素变化,优化列表渲染。
实现代码分割(Code Splitting)
- 动态 import() 语法
- 动态 import() 是 ES2020 引入的语法,返回一个 Promise:
// 普通模块中使用
import("./math").then(math => {
console.log(math.add(16, 26));
});
// React 组件中使用
import("./OtherComponent").then(OtherComponent => {
// 使用加载的组件
});
- React.lazy + Suspense
- React.lazy 和 Suspense 来实现组件的懒加载:
import React, { Suspense } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
function MyComponent() {
return (
<div>
<Suspense fallback={<div>Loading...</div>}>
<OtherComponent />
</Suspense>
</div>
);
}
发表回复