31 Hooks的使用之useState与useEffect的介绍

在上一篇中,我们讨论了React Router,学习了如何使用LinkNavLink进行页面导航。这为我们构建多页面应用奠定了基础。现在,让我们进入React的核心概念之一:Hooks,特别是useStateuseEffect的使用。

什么是Hooks?

HooksReact 16.8引入的一种新特性,让我们能够在不编写类组件的情况下使用state和其他React特性。useStateuseEffect是最常用的两个Hooks,它们分别用于处理组件的状态和副作用。

useState

useState是一个用于声明组件状态的Hook。它返回一个包含当前状态和更新状态的函数的数组。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import React, { useState } from 'react';

function Counter() {
const [count, setCount] = useState(0); // useState用于声明状态

return (
<div>
<p>你点击了 {count} 次</p>
<button onClick={() => setCount(count + 1)}>
点击我
</button>
</div>
);
}

export default Counter;

在上面的示例中,我们使用useState(0)声明了一个名为count的状态变量,并将其初始化为0setCount是一个函数,用于更新count的值。当我们点击按钮时,count的值会增加1

useEffect

useEffect是一个用于处理副作用的Hook。副作用可以是数据获取、订阅或手动更改DOM等。我们可以将其视为componentDidMountcomponentDidUpdatecomponentWillUnmount的组合。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import React, { useState, useEffect } from 'react';

function Timer() {
const [seconds, setSeconds] = useState(0);

useEffect(() => {
const intervalId = setInterval(() => {
setSeconds(prevSeconds => prevSeconds + 1);
}, 1000);

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

return (
<div>
<p>已计时 {seconds} 秒</p>
</div>
);
}

export default Timer;

在这个示例中,我们使用useEffect来设置一个定时器,更新seconds的状态。定时器每秒增加一次seconds的值。此外,我们在useEffect内部返回了一个清理函数,以确保组件卸载时定时器被清除。

结合案例

现在,让我们将useStateuseEffect结合起来,创建一个简单的计数器和定时器应用,让用户可以开始、停止和重置计时。

完整代码示例

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
import React, { useState, useEffect } from 'react';

function TimerApp() {
const [seconds, setSeconds] = useState(0);
const [isActive, setIsActive] = useState(false);

useEffect(() => {
let intervalId;

if (isActive) {
intervalId = setInterval(() => {
setSeconds(prevSeconds => prevSeconds + 1);
}, 1000);
} else {
clearInterval(intervalId);
}

return () => clearInterval(intervalId); // 清理副作用
}, [isActive]); // 依赖于isActive状态

const startTimer = () => setIsActive(true);
const stopTimer = () => setIsActive(false);
const resetTimer = () => {
setIsActive(false);
setSeconds(0);
};

return (
<div>
<h1>计时器</h1>
<p>已计时 {seconds} 秒</p>
<button onClick={startTimer}>开始</button>
<button onClick={stopTimer}>停止</button>
<button onClick={resetTimer}>重置</button>
</div>
);
}

export default TimerApp;

总结

在这一章中,我们学习了useStateuseEffect的基本用法。useState让我们能够在函数组件中管理状态,而useEffect则处理副作用。通过示例,我们构建了一个简单的计时器应用,展示了如何将这两个Hooks结合使用。

在下一章中,我们将进一步探讨自定义Hooks,学习如何封装和重用逻辑,使我们的代码更加模块化和可维护。随着我们对Hooks的深入理解,它们将为我们的React开发提供更大的灵活性与可能性。

31 Hooks的使用之useState与useEffect的介绍

https://zglg.work/react-zero/31/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论