interview
advanced-react
在 React 中发起网络请求应该放在生命周期的哪个阶段为什么

React 进阶面试题, 在 React 中,发起网络请求应该放在生命周期的哪个阶段?为什么?

React 进阶面试题, 在 React 中,发起网络请求应该放在生命周期的哪个阶段?为什么?

QA

Step 1

Q:: 在 React 中,发起网络请求应该放在生命周期的哪个阶段?为什么?

A:: 在 React 中,通常将网络请求放在 componentDidMountuseEffect 钩子中(对于函数组件)。原因是当组件完成挂载时,DOM 已经准备好,因此发起网络请求是安全的,且不会阻塞 UI 的渲染。这样做也可以确保请求只在组件加载时发起,而不会在每次重绘时重复发起。

Step 2

Q:: React 中的 useEffect 钩子与类组件中的生命周期方法有什么对应关系?

A:: useEffect 钩子可以看作是类组件中 componentDidMountcomponentDidUpdatecomponentWillUnmount 这些生命周期方法的结合体。通过 useEffect,你可以在函数组件中处理副作用,例如数据获取、订阅或手动操作 DOM。使用 useEffect 的第一个参数定义要执行的副作用函数,第二个参数(依赖数组)决定何时重新执行这个副作用函数。

Step 3

Q:: 在 React 中如何确保组件在卸载时正确取消正在进行的网络请求?

A:: 在 React 中,为了避免组件卸载后仍然尝试更新状态而引发内存泄漏,应该在网络请求发出前创建一个标志(如使用 useRef 来保存一个布尔值),在组件卸载时设置该标志,并在网络请求的响应中检查该标志的状态。如果组件已卸载,则不进行状态更新。同时,也可以使用 AbortController 来手动取消 fetch 请求。

Step 4

Q:: React 如何优化网络请求的发起频率?

A:: React 可以通过使用 useEffect 钩子中的依赖数组或 React.memouseMemouseCallback 等优化工具来减少不必要的网络请求。依赖数组可以确保副作用函数只在依赖变化时重新执行,从而避免重复请求。此外,使用缓存策略、去抖动和节流技术也可以有效减少网络请求的频率。

Step 5

Q:: 在 React 中如何处理并行的多个网络请求?

A:: 在 React 中,可以使用 Promise.allPromise.allSettled 来并行处理多个网络请求。Promise.all 会在所有请求都成功时返回结果,若有任意一个请求失败,则整体失败。而 Promise.allSettled 无论每个请求的结果是成功还是失败,都会返回每个请求的结果。这两种方法都可以在 useEffectcomponentDidMount 中使用,以确保组件挂载后同时发起多个请求并处理结果。

用途

这些问题的目的是评估候选人对 React 中处理副作用的理解,特别是在组件生命周期内管理网络请求的能力。实际生产环境中,几乎所有的 React 应用都涉及到与外部 API 的交互,因此掌握何时何地发起网络请求,以及如何优化和管理这些请求,是前端开发者必须具备的技能。通过这些问题,可以判断候选人是否能够有效管理组件的状态,避免常见的错误(如内存泄漏)并优化应用性能。\n

相关问题

🦆
React 中的 useCallback 和 useMemo 有什么作用?什么时候应该使用它们?

useCallbackuseMemo 都用于性能优化。useCallback 返回一个 memoized 回调函数,避免在组件重新渲染时不必要地重新创建函数。useMemo 则会返回 memoized 值,用于避免在每次渲染时进行昂贵的计算操作。它们应该在组件渲染性能受到影响时使用,特别是当函数或值的重新计算代价较高时。

🦆
如何在 React 中管理全局状态?

在 React 中,可以使用 Context API 或状态管理库如 ReduxMobX 等来管理全局状态。Context API 适用于简单的全局状态共享,而对于更复杂的应用,使用 Redux 这种具有更强扩展性和中间件支持的库可能更为合适。全局状态管理有助于在整个应用中共享数据,而不必通过逐层传递 props。

🦆
在 React 中如何处理错误边界?

React 提供了错误边界组件(Error Boundaries)来捕获子组件树中的 JavaScript 错误,并防止这些错误破坏整个应用。错误边界可以通过在类组件中实现 componentDidCatchgetDerivedStateFromError 方法来创建。函数组件则可以使用 React 18 引入的 useErrorBoundary 钩子。错误边界的作用是隔离错误,并显示备用 UI,确保应用的其余部分仍然能够正常工作。

🦆
在 React 中如何处理异步操作导致的状态更新冲突?

当多个异步操作可能影响组件状态时,可以通过以下方法处理状态更新冲突:1. 使用唯一标识符(如请求的时间戳或请求 ID)来确定哪个请求的结果应生效。2. 在状态更新前检查组件是否已卸载或处于期望的状态。3. 使用 AbortController 取消不需要的请求,以避免由于旧请求完成而导致的冲突。

🦆
React 中如何优化组件的重渲染?

优化 React 组件重渲染的方式有:1. 使用 React.memo 对函数组件进行浅层比较,避免不必要的重渲染。2. 使用 useCallbackuseMemo 缓存函数和计算结果。3. 确保 useEffect 钩子只有在相关依赖变化时才执行。4. 使用虚拟化技术(如 react-windowreact-virtualized)优化长列表的渲染。