React Native面试题2025——生命周期(7)

一 概述

  1. 解释 React Native 中组件的生命周期方法,例如 componentDidMountcomponentWillUnmount
  2. 如何在 React Native 中使用 hooks(如 useStateuseEffectuseCallback)?与类组件中的生命周期方法有何不同?
  3. 何时使用 useEffect 钩子?如何优化 useEffect 的性能,避免不必要的重新执行?

二 面试题解答(仅供参考)

2.1 解释 React Native 中组件的生命周期方法,例如 componentDidMountcomponentWillUnmount

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在 React Native 中,组件的生命周期方法是指组件从创建到销毁的过程中,React 会自动调用的一些方法。
常用的生命周期方法有:

一、componentDidMount()
-作用:在组件挂载到屏幕后(即渲染完成并且添加到 DOM 中)调用一次。常用于执行异步操作,如数据请求或订阅事件。
-使用场景:用于发起网络请求、设置定时器、添加事件监听等。

二、componentWillUnmount()
作用:在组件从屏幕上卸载之前(即组件被销毁之前)调用一次。常用于清理工作,如取消订阅、清除定时器、移除事件监听等。
使用场景:用于清理资源,避免内存泄漏。


三其他常用生命周期方法
-componentDidUpdate():组件更新后调用。适用于在状态或属性变化后执行某些操作。
-shouldComponentUpdate():在组件更新之前调用,用于决定是否需要重新渲染组件。常用于性能优化。
-getDerivedStateFromProps():在每次渲染前调用,用于根据 props 更新 state。

总结
-componentDidMount() 用于组件挂载后执行操作,如数据加载。
-componentWillUnmount() 用于组件卸载前清理资源,避免内存泄漏。
这些生命周期方法帮助开发者在适当的时候管理资源和执行必要的操作。

2.2 如何在 React Native 中使用 hooks(如 useStateuseEffectuseCallback)?与类组件中的生命周期方法有何不同?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
在 React Native 中,Hooks 是 React 16.8 引入的功能,它使函数组件可以使用状态和其他 React 特性。
常用的 Hook 包括 useState、useEffect 和 useCallback。

一、常用Hook
1.1 useState
作用:用于在函数组件中声明状态变量,并返回该变量及其更新函数。
1.2 useEffect
作用:用于在组件挂载(类似 componentDidMount)或更新后执行副作用操作。
可以替代类组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount。
1.3 useCallback
作用:用于记住一个函数的引用,避免每次渲染时重新创建函数。这对于性能优化有帮助,尤其是在将函数传递给子组件时。

二、与类组件中的生命周期方法的区别:
2.1 状态管理:
在类组件中,通过 this.state 和 this.setState 管理状态;而在函数组件中,使用 useState 来管理状态。

2.2 副作用处理:
类组件通过生命周期方法(如 componentDidMount、componentDidUpdate)处理副作用;
而函数组件则通过 useEffect 来执行副作用。

2.3 清理工作:
类组件通过 componentWillUnmount 来清理资源;而函数组件可以在 useEffect 的返回函数中进行清理。

2.4 函数优化:类组件中的方法每次渲染时都会重新创建;而在函数组件中,可以使用 useCallback 来避免重新创建函数

三、总结:
-useState 用于在函数组件中管理状态。
-useEffect 用于处理副作用(如网络请求、事件监听等)。
-useCallback 用于优化函数的引用,避免不必要的重新渲染。

2.3 何时使用 useEffect 钩子?如何优化 useEffect 的性能,避免不必要的重新执行?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
一、useEffect
useEffect 钩子用于在 React Native 的函数组件中执行副作用操作,
如数据请求、订阅事件、手动修改 DOM 或其他与组件渲染无关的操作。
它在组件挂载、更新后执行,并可用于执行清理操作
(类似类组件的 componentDidMount、componentDidUpdate 和 componentWillUnmount)。

二、何时使用 useEffect 钩子?
-数据请求:在组件挂载时获取数据并更新状态。
-订阅事件:例如添加事件监听器,处理外部库的交互。
-执行副作用:如设置定时器、手动修改 DOM 或与外部系统通信等。
-清理资源:在组件卸载时清除副作用,如移除事件监听器或清除定时器。

三、如何优化 useEffect 的性能,避免不必要的重新执行?
3.1 使用依赖数组:
useEffect 的第二个参数是依赖数组,只有依赖数组中的值发生变化时,useEffect 才会重新执行。
通过传入依赖数组来控制 useEffect 何时执行,避免每次组件渲染都执行副作用。

-空数组 []:只有在组件挂载时执行一次,类似 componentDidMount。
useEffect(() => {
// 仅在组件挂载时执行一次
}, []);

-特定依赖值:仅在依赖的值发生变化时执行。
useEffect(() => {
// 仅在 `count` 变化时执行
}, [count]);

3.2 清理副作用: 在 useEffect 中返回一个清理函数,用于组件卸载时清除副作用,避免内存泄漏或重复操作。
useEffect(() => {
const timer = setInterval(() => {
console.log('每隔1秒打印');
}, 1000);

// 清理副作用
return () => clearInterval(timer); // 组件卸载时清除定时器
}, []); // 依赖为空,表示只在挂载时执行

3.3 避免不必要的副作用:
-确保 useEffect 中的副作用只处理相关的逻辑,避免每次渲染都执行不必要的操作。
-使用 useMemo 或 useCallback 来优化传递给 useEffect 的回调函数或计算结果,避免每次渲染都重新创建。

总结:
-useEffect 主要用于处理副作用操作,并且可以通过依赖数组控制何时重新执行。
-通过合理使用依赖数组,清理副作用,以及优化依赖项的稳定性,可以避免不必要的重新执行,从而提升性能。