React 中的 setState 和 prevState
我们将介绍 setState
和 prevState
并在 React 中使用它们。
React 中的 setState
和 prevState
setState()
和 prevState()
是 useState
钩子,用于更改 React 类组件中的状态。
setState()
表示该组件及其子组件发生了变化,需要使用更新后的状态重新渲染。setState
是用于更新 UI 以响应事件处理程序和服务器响应的主要方法。
prevState()
与 setState
相同,但它们之间的唯一区别是,如果我们想根据该组件的先前状态更改该组件的状态,我们使用 this.setState()
,它为我们提供了 prevState
。
让我们检查一个计数器应用程序的示例。这可以增加、减少、重置数字。
首先,我们将创建一个新文件 Counter.js
。在 Counter.js
我们将 import React from "react";
并创建一个名为 Counter()
的函数。
在 Counter()
中,我们将初始化我们的常量 initialNum
、num
和 setNum
# react
import React from "react";
function Counter() {
const initialNum = 0;
const [num, setNum] = React.useState(initialNum);
}
我们将返回带有按钮和计数器显示的 HTML。因此,Counter.js
将如下所示。
# react
import React from "react";
function Counter() {
const initialNum = 0;
const [num, setNum] = React.useState(initialNum);
};
return (
<div>
<p>Counter: {num}</p>
<button onClick={() => setNum(initialNum)}>Reset</button>
<button onClick={() => setNum(num + 1)}>Increment</button>
<button onClick={() => setNum(num - 1)}>Decrement</button>
</div>
);
}
export default Counter;
让我们在 App.js
中包含 Counter.js
并添加它的组件。App.js
将如下所示。
# react
import "./styles.css";
import Counter from "./Counter.js";
export default function App() {
return (
<div className="App">
<Counter />
</div>
);
}
现在,让我们测试一下我们的计数器。
输出:
让我们添加另一个按钮,将计数器增加 5。
# react
<button onClick={IncrementByFive}>Increment By 5</button>
让我们创建一个函数 IncrementByFive
。
# react
const IncrementByFive = () => {
for (let i = 0; i < 5; i++) {
setNum(num + 1);
}
};
此函数将循环五次以将其递增 5。
现在,让我们测试我们的计数器应用程序。
输出:
当我们点击 Increment by 5
按钮时,它只会将计数器增加 1。
这是因为在 setNum(num + 1);
有多个 setNum
调用,因此 React 将所有这些调用分组并仅在最后一次调用 setNum
时更新状态,并且因为在最后一次调用中 setNum
尚未更新并且仍然具有相同的值,所以它仅将其增加 1。
这就是 prevState
派上用场并像冠军一样解决我们的问题的时候。现在,让我们使用 prevState
重写我们的计数器应用程序。
基本上,我们不是传入新状态变量的值,而是传入一个可以访问旧状态值的函数。因此,现在我们将通过更改 setNum(num + 1);
来更改 IncrementByFive
函数到 setNum(prevNum => prevNum + 1);
。
因此,我们的函数将如下所示。
# react
const IncrementByFive = () => {
for (let i = 0; i < 5; i++) {
setNum(prevNum => prevNum + 1);
}
};
现在,让我们测试我们的计数器应用程序。
输出:
在上面的结果中,当我们点击 Increment by 5
时,它会增加 5。
让我们也使用 prevState
来更正我们的其他按钮。
Counter.js
如下所示。
# react
import React from "react";
function Counter() {
const initialNum = 0;
const [num, setNum] = React.useState(initialNum);
const IncrementByFive = () => {
for (let i = 0; i < 5; i++) {
setNum((prevNum) => prevNum + 1);
}
};
return (
<div>
<p>Counter: {num}</p>
<button onClick={() => setNum(initialNum)}>Reset</button>
<button onClick={() => setNum((prevNum) => prevNum + 1)}>
Increment
</button>
<button onClick={() => setNum((prevNum) => prevNum - 1)}>
Decrement
</button>
<button onClick={IncrementByFive}>Increment By 5</button>
</div>
);
}
export default Counter;
因此,在本指南中,我们了解了可以使用 prevState
解决的问题,并且我们还使用 setState
和 prevState
在 React 中构建了一个基本的计数器应用程序。
Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.
LinkedIn