← 返回目录

第 12 卷

第 12 / 28 卷日期:

触发组件重新渲染Vue3:Proxy),state 是响应式数据,修改后自动触发组

件更新

模块化支持原生不支持模块化,需通过原生支持 modules 模块,可
combineReducers 合并多个按业务拆分状态(如 user 模
reducer 实现模块化拆分块、cart 模块),支持命名空

间(namespaced)避免冲突

异步逻辑处理原生不支持异步,必须借助中原生支持异步,通过 action
间件(redux-thunk、redux-处理异步逻辑(如网络请
saga 等)处理异步逻辑求),异步完成后通过

commit 触发 mutation

组件集成方式React 组件通过 useSelectorVue 组件通过 mapState、
(函数组件)或 connect 高mapGetters 等辅助函数映射
阶组件获取状态,通过状态到组件,通过
dispatch 触发 actionmapActions 映射 action 到

组件方法

2. Redux 与 Vuex 共有的设计思想

尽管 Redux 和 Vuex 存在诸多差异,但核心设计思想高度一致,均源于“单向数据流”和“集中式状态管理”的理念,具体共有思想如下:

• 集中式状态管理:将应用中所有组件共享的状态集中存储在一个全局容器(store)中,避免状态分

散在各个组件中导致的同步问题,实现状态的统一管理和维护。

• 单向数据流:状态流转遵循“单向”规则,确保状态变化可预测。核心流程均为“组件触发操作

  • 状态容器处理逻辑 → 状态更新 → 组件渲染”,禁止组件直接修改全局状态,避免状态变化混

乱。

• 分离状态修改逻辑:将状态修改逻辑与组件 UI 逻辑分离,组件仅负责触发操作(如点击按钮触发

action)和渲染 UI,状态修改逻辑(如异步处理、状态计算)由 store 中的专门模块(reducer/mutation、action)处理,降低组件复杂度。

• 状态可追踪:通过规范的状态修改流程,使得每一次状态变化都有明确的触发源头(如 action 描

述),便于调试和问题排查。两者均支持调试工具(Redux DevTools、Vue DevTools),可查看状态变化历史。

• 组件解耦:通过全局 store 实现组件间的间接通信,无需依赖组件层级关系(如父子、跨层级),

二十三、什么是 React Hooks?为什么 React 团队引入了 Hooks?

  1. 什么是 React Hooks?

React Hooks 是 React 16.8 版本引入的新特性,本质是“可在函数组件中使用的特殊函数”,用于让函数组件拥有类组件的核心能力(如状态管理、生命周期、上下文访问等),同时避免类组件的复杂

问题(如 this 指向、生命周期嵌套、HOC 嵌套地狱等)。

核心特点:

• 只能在函数组件的顶层调用(不可在条件判断、循环、嵌套函数中调用),确保 Hooks 执行顺序

稳定;

  • 只能在 React 函数组件或自定义 Hooks 中使用,不能在普通 JavaScript 函数中使用;

• 通过“钩子”的方式将 React 内部能力“注入”到函数组件中,无需编写类组件即可实现复杂功

能。

常用内置 Hooks:

  • useState:用于在函数组件中添加状态(state);

• useEffect:用于处理函数组件的副作用(如网络请求、DOM 操作、定时器),替代类组件的生命

周期;

  • useContext:用于在函数组件中访问 React Context,实现跨组件通信;
  • useReducer:用于复杂状态管理,替代 useState,类似 Redux 的 reducer 逻辑;
  • useRef:用于获取 DOM 元素或存储持久化数据(组件重新渲染时数据不丢失);
  • useMemo/useCallback:用于性能优化,缓存计算结果或函数引用。

2. React 团队引入 Hooks 的原因

React 团队引入 Hooks 的核心目标是“解决类组件的固有问题,优化函数组件的开发体验和代码质量”,具体原因可分为以下 4 点:

• 解决类组件 this 指向混乱问题:类组件中 this 指向动态变化(如事件回调中 this 可能为

undefined),需要通过 bind 绑定或箭头函数等方式规避,增加了代码冗余和学习成本。Hooks 基于函数组件,无需关注 this 指向,代码更简洁直观。

• 解决生命周期逻辑分散与冗余问题:类组件的生命周期方法(如 componentDidMount、

componentDidUpdate、componentWillUnmount)常常包含多个不相关的逻辑(如网络请求、定时器绑定、事件监听),导致代码臃肿且难以维护;同时,相关逻辑可能分散在不同生命周期中

(如定时器绑定在 componentDidMount,清除在 componentWillUnmount),增加了逻辑关联的理解成本。Hooks 中的 useEffect 可将相关逻辑聚合在一起,通过依赖数组控制执行时机,替

代多个生命周期方法。

• 解决组件复用逻辑复杂问题:类组件中复用逻辑的方案(如高阶组件 HOC、Render Props)存在

义 Hooks 复用逻辑,无需组件嵌套,代码更简洁、复用性更强。

• 简化状态管理与逻辑组织:类组件的状态管理需要通过 state 和 setState 实现,复杂状态逻辑(如

依赖多个子状态的计算)难以拆分;而 Hooks 中的 useState 可实现状态的细粒度拆分, useReducer 可处理复杂状态逻辑,让状态管理更灵活。同时,Hooks 让函数组件成为 React 开发

的主流选择,函数式编程的思想(纯函数、无副作用)更符合 React 的设计理念,便于代码的测试和维护。

补充:Hooks 并非要完全替代类组件,而是提供了更优的函数组件开发方案。React 至今仍支持类组件,但官方推荐新项目优先使用 Hooks 开发。

二十四、useState 和类组件的 state 有什么区别?

useState 是 Hooks 中用于函数组件的状态管理方案,类组件的 state 是传统的状态管理方案,两者核心目标都是“管理组件状态”,但在使用方式、状态更新逻辑、数据结构、生命周期关联、性能优化

等方面存在显著差异:

对比维度useState(函数组件)类组件的 state
使用方式通过数组解构获取状态和更新通过构造函数初始化或类属性
函数:const [count,声明:state = {
setCount] =count: 0, name: 'xxx'
useState(0);每个状态独};所有状态集中在一个对象
立声明,可拆分多个中。

useState。

状态更新方式调用更新函数(如调用 setState 方法更新状
setCount)更新状态,支持态,支持两种方式:传入对象
两种方式:传入新值(this.setState({
(setCount(1))或传入count: 1 }))或传入函数
函数(setCount(prev(this.setState(prev
=> prev + 1));更新函=> ({ count:
数是异步的。prev.count + 1 })));

setState 是异步的(批量更新)。

状态合并规则无自动合并:useState 是独自动浅合并:setState 传入的
立状态,更新一个状态不会影对象会与原有 state 进行浅合
响其他状态;若需合并多个相并,仅更新指定的状态字段,
关状态,需手动处理(或使其他字段保留原值(如
全站分卷索引 · 28 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷
  20. 20第 20 卷
  21. 21第 21 卷
  22. 22第 22 卷
  23. 23第 23 卷
  24. 24第 24 卷
  25. 25第 25 卷
  26. 26第 26 卷
  27. 27第 27 卷
  28. 28第 28 卷