Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[React] 是如何处理组件更新和渲染的?【热度: 862】 #746

Open
yanlele opened this issue May 10, 2024 · 0 comments
Open

[React] 是如何处理组件更新和渲染的?【热度: 862】 #746

yanlele opened this issue May 10, 2024 · 0 comments
Labels
web框架 web 框架相关知识 快手 公司标签
Milestone

Comments

@yanlele
Copy link
Member

yanlele commented May 10, 2024

关键词:React 组件更新、React 组件渲染

React 组件的更新和渲染遵循一个相对严格的生命周期,这个生命周期在 React 16 版本之后,也就是从引入 Fiber 架构开始,稍微有所变化。React 通过一系列的生命周期方法以及新引入的 Hooks API,对组件的更新进行管理,主要流程如下:

类组件的生命周期方法包括:

  1. 挂载(Mounting)

    • constructor(): 组件被创建时调用,初始化 state。
    • static getDerivedStateFromProps(): 组件实例化后和接受新属性时将会调用。
    • render(): 唯一必须实现的方法,返回元素描述。
    • componentDidMount(): 组件挂载(插入 DOM 树中)之后调用。
  2. 更新(Updating)

    • static getDerivedStateFromProps(): 在接收到新的 props 时调用。
    • shouldComponentUpdate(): 在接收到新的 props 或者 state 时,决定是否进行渲染。
    • render(): 重新渲染组件。
    • getSnapshotBeforeUpdate(): 在最新的渲染输出提交到 DOM 前将会立即调用。
    • componentDidUpdate(): 在组件更新后调用。
  3. 卸载(Unmounting)

    • componentWillUnmount(): 在组件卸载及销毁之前直接调用。

React 16.3 之后的生命周期的变化

React 团队增加了新的生命周期方法,并且准备弃用某些旧的生命周期方法(如 componentWillMountcomponentWillReceivePropscomponentWillUpdate 等)。引入了如 static getDerivedStateFromPropsgetSnapshotBeforeUpdate 等新的生命周期方法。

函数组件和 Hooks

在 React 16.8 版本后,引入了 Hooks API,允许在不编写类的情况下使用 state 以及其他的 React 特性。对于函数组件,有几个常用的 Hooks:

  • useState: 在函数组件中添加 state。
  • useEffect: 可以在组件中执行副作用操作(数据请求、订阅以及手动更改 React 组件中的 DOM 等)。
  • useContext: 允许你访问 React 的 Context 对象。
  • useReducer: 另一种在组件中管理 state 的方式,它用于复杂的 state 逻辑。
  • 其他 Hooks(如 useCallback, useMemo, useRef 等)。

更新和渲染流程:

  1. 当组件的 state 或者 props 发生变化时,React 会将新的 props 和 state 比较之前的,根据比较结果决定是否进行更新。
  2. 如果 shouldComponentUpdatePureComponent 或 React.memo 表示不需要更新,React 将不会进行更新。
  3. 如果需要更新,React 会调用 render 方法以及相关的生命周期方法或 Hooks,这个过程会创建一个虚拟 DOM 树。
  4. React 之后会对比新的虚拟 DOM 树与上一次更新时的虚拟 DOM 树,通过 DOM diffing 算法判断在哪进行实际的 DOM 更新。
  5. 应用必要的 DOM 更新到实际的 DOM 树上,如果有必要,调用 getSnapshotBeforeUpdatecomponentDidUpdate 方法。

这个过程保持了 React 组件的高效和可预测性,同时提供了生命周期的方法和 Hooks,使开发者能够插入自定义行为或响应组件的生命周期事件。

@yanlele yanlele added web框架 web 框架相关知识 快手 公司标签 labels May 10, 2024
@yanlele yanlele added this to the milestone May 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
web框架 web 框架相关知识 快手 公司标签
Projects
None yet
Development

No branches or pull requests

1 participant