31 Hooks的使用之useState与useEffect的介绍
在上一篇中,我们讨论了React Router
,学习了如何使用Link
和NavLink
进行页面导航。这为我们构建多页面应用奠定了基础。现在,让我们进入React
的核心概念之一:Hooks
,特别是useState
和useEffect
的使用。
什么是Hooks?
Hooks
是React 16.8
引入的一种新特性,让我们能够在不编写类组件的情况下使用state
和其他React
特性。useState
和useEffect
是最常用的两个Hooks
,它们分别用于处理组件的状态和副作用。
useState
useState
是一个用于声明组件状态的Hook
。它返回一个包含当前状态和更新状态的函数的数组。
示例代码
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
的状态变量,并将其初始化为0
。setCount
是一个函数,用于更新count
的值。当我们点击按钮时,count
的值会增加1
。
useEffect
useEffect
是一个用于处理副作用的Hook
。副作用可以是数据获取、订阅或手动更改DOM
等。我们可以将其视为componentDidMount
、componentDidUpdate
和componentWillUnmount
的组合。
示例代码
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
内部返回了一个清理函数,以确保组件卸载时定时器被清除。
结合案例
现在,让我们将useState
和useEffect
结合起来,创建一个简单的计数器和定时器应用,让用户可以开始、停止和重置计时。
完整代码示例
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;
总结
在这一章中,我们学习了useState
和useEffect
的基本用法。useState
让我们能够在函数组件中管理状态,而useEffect
则处理副作用。通过示例,我们构建了一个简单的计时器应用,展示了如何将这两个Hooks
结合使用。
在下一章中,我们将进一步探讨自定义Hooks
,学习如何封装和重用逻辑,使我们的代码更加模块化和可维护。随着我们对Hooks
的深入理解,它们将为我们的React
开发提供更大的灵活性与可能性。