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