reactjs - 在前一行我正在做 setCurrentPage(value),在下一行:console.log(CurrentPage, value),CurrentPage 和 value 是不同的。为什么?
问题描述
我有这段代码,其中包含 my 的值currentPage
:
const [currentPage, setCurrentPage] = useState(0);
当我单击按钮时会触发此功能。
function logsPagination(page) {
setCurrentPage(page);
console.log("currentPage " + currentPage + " page" + page);
//currentPage 1 page0
//currentPage 0 page-1
//currentPage -1 page0
//currentPage 0 page13
}
为什么 currentPage 和 中的参数page
不同console.logs
?永远不是相同的值。尽管理论上它们应该具有相同的值,尽管我理解这可能是由于 is时正在useState
完成。component
rendered
console.log
更新后我该怎么做setCurrentPage
?例如:
//currentPage 1 page1 //currentPage 0 page0 //currentPage -1 page-1
这是我的实时代码:
https://codesandbox.io/s/late-meadow-ns6g6?file=/src/App.js:117-131
import React, { useState, useEffect, useRef } from "react";
export default function Table() {
const [currentPage, setCurrentPage] = useState(0);
const [maxPage, setMaxPage] = useState(0);
const [items, setItems] = useState([]);
const USERS_URL = `https://jsonplaceholder.typicode.com/posts`;
useEffect(() => {
getItems();
}, [currentPage]);
function logsPagination(page) {
setCurrentPage(page);
console.log("currentPage " + currentPage + " page" + page);
}
function getItems() {
fetch(`${USERS_URL}?page=${currentPage}&limit=5`, {
method: "GET"
})
.then((response) => response.json())
.then((data) => {
let datacustom = {
count: 13,
results: data.splice(0, 10)
};
setItems(datacustom.results);
setMaxPage(datacustom.count);
});
}
return (
<div>
<table className="table">
<thead>
<tr>
<th>ID</th>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tbody>
{items.map((item) => {
return (
<tr key={item.id}>
<td>{item.id}</td>
<td>{item.id}</td>
<td>{item.id}</td>
</tr>
);
})}
</tbody>
</table>
<section className="pagination">
<button
className="first-page-btn"
onClick={() => {
logsPagination(0);
}}
disabled={false}
>
first
</button>
<button
className="previous-page-btn"
onClick={() => {
logsPagination(currentPage - 1);
}}
disabled={false}
>
previous
</button>
<button
className="next-page-btn"
onClick={() => {
logsPagination(currentPage + 1);
}}
disabled={false}
>
next
</button>
<button
className="last-page-btn"
onClick={() => {
logsPagination(maxPage);
}}
disabled={false}
>
last
</button>
</section>
</div>
);
}
解决方案
这是因为setStates
调用(即setCurrentPage
)本质上是异步的,这意味着在设置状态后立即执行 console.log 不会记录刚刚更新的值。相反,React 会将这些 setState 安排到下一个渲染中 - 因此,您只能在下一个渲染周期中查看/访问最新的值。来自官方 React 文档
- 将 setState() 视为更新组件的请求而不是立即命令。为了更好地感知性能,React 可能会延迟它,然后一次更新多个组件。React 不保证立即应用状态更改
- setState() 并不总是立即更新组件。它可能会批量更新或将更新推迟到以后。这使得在调用 setState() 之后立即读取
this.state
是一个潜在的陷阱。取而代之的是 usecomponentDidUpdate
或setState
callback(setState(updater, callback))
,它们都保证在应用更新后触发。
你可能还想看看我之前写过的关于这个问题的答案:React cannot update state
推荐阅读
- apache - 基于 TSL/SSL 的 HTTP CONNECT 握手
- airflow - 有人可以帮我启动 apache 气流吗?
- django - 如何为 Apache 提供的 django 应用程序将 http url 重定向到 https
- asp.net-mvc - 如何在 ViewModel 中添加两个连续的 Display 语法?
- sql - 通过比较和检索涉及多列的数据的 SQL INSERT 语句
- image-processing - imagemagick mogrify 调整大小 - 失去第三维
- python - 仅使用脚本中的一列,但也打印同一索引的另一列
- reactjs - 如何在 React-Router 4 中保留查询字符串和哈希片段
? - python - 在列表中定位一个 html 链接地址字符串
- python - 如何计算列表列表中相同值的最长序列,然后输出元组中的最大序列