gpt4 book ai didi

javascript - 为什么 React-app 状态没有在这里重新渲染?如何让状态及时更新

转载 作者:行者123 更新时间:2023-12-02 21:32:10 25 4
gpt4 key购买 nike

我正在尝试弄清楚这是如何工作的。

我有一个“pageCounter”变量,用于跟踪当前页面(单击上一个/下一个按钮时更新),当它更新时,我想将选项卡的标题更改为新页面数据。

当我单击“下一步”按钮时,除非我单击两次并且控制台日志显示它尚未更新,否则它不会呈现。但是,当我点击“下一步”后单击“日志”按钮时,它说它已更新?

我已经完成了研究,并假设这是由于“setState”函数的异步性质造成的。但是,我不确定如何解决这个问题?

我尝试将 updateTitles 函数放入 useEffect Hook 中,但无论我将函数的内容复制到其中,还是调用 Hook 中的函数,都会出现错误。

我错过了什么?

updateTitles 的内容放入 useEffect 时遇到的错误是:

Maximum Update Depth Exceeded.

这是组件代码:(code sandbox here)

import React from "react";
import "./styles.css";

import React, { useState, useEffect } from "react";

function Options() {
// Component States
const [pageCounter, setPage] = useState(1);
const [optionTitles, setOptionTitles] = useState({
Option1: "End of Lease Clean",
Option2: "Regular House Cleaning",
Option3: "Other Clean"
});
//Component Variables
const pageOneTitles = {
Option1: "End of Lease Clean",
Option2: "Regular House Cleaning",
Option3: "Other Clean"
};
const pageTwoTitles = {
Option1: "Blah1",
Option2: "Blah12",
Option3: "Blah13"
};
const pageThreeTitles = {
Option1: "MrMagoo",
Option2: "Nins",
Option3: "Pottao"
};

function updateTitles() {
switch (pageCounter) {
case 1:
setOptionTitles(pageOneTitles);
break;
case 2:
setOptionTitles(pageTwoTitles);
break;
case 3:
setOptionTitles(pageThreeTitles);
break;
default:
console.log("default");
break;
}
}

function nextPage() {
if (pageCounter < 3) {
setPage(pageCounter + 1);
updateTitles();
console.log(pageCounter);
}
}

function prevPage() {
if (pageCounter > 1) {
setPage(pageCounter - 1);
updateTitles();
console.log(pageCounter);
}
}

function printLog() {
console.log(pageCounter);
}

return (
<div id="options">
<button onClick={prevPage} id="next">
Back
</button>
<CardOption title={optionTitles.Option1} />
<CardOption title={optionTitles.Option2} />
<CardOption title={optionTitles.Option3} />
<p>{}</p>
<button onClick={nextPage} id="next">
Next
</button>
<button onClick={printLog} id="next">
log
</button>
</div>
);
}
function CardOption(props) {
return (
<div className="card">
<h2>{props.title}</h2>
</div>
);
}

export default Options;

这是当我尝试使用钩子(Hook) useEffect 时的代码,但我收到一条错误消息“超出最大更新深度”。

        import React, { useState, useEffect } from "react";

function Options() {
// Component States
const [pageCounter, setPage] = useState(1);
const [optionTitles, setOptionTitles] = useState({
Option1: "Page 1.11",
Option2: "Regular House Cleaning",
Option3: "Other Clean"
});
//Component Variables
const pageOneTitles = {
Option1: "Page 1.1",
Option2: "Regular House Cleaning",
Option3: "Other Clean"
};
const pageTwoTitles = {
Option1: "Page 2.1",
Option2: "Blah12",
Option3: "Blah13"
};
const pageThreeTitles = {
Option1: "Page 3.1",
Option2: "Nins",
Option3: "Pottao"
};

useEffect(() => {
switch (pageCounter) {
case 1:
setOptionTitles(pageOneTitles);
break;
case 2:
setOptionTitles(pageTwoTitles);
break;
case 3:
setOptionTitles(pageThreeTitles);
break;
default:
console.log("default");
break;
}
}, [pageCounter, pageOneTitles, pageTwoTitles, pageThreeTitles]);

function nextPage() {
if (pageCounter < 3) {
setPage(pageCounter + 1);
console.log(pageCounter);
}
}

function prevPage() {
if (pageCounter > 1) {
setPage(pageCounter - 1);
console.log(pageCounter);
}
}

function printLog() {
console.log(pageCounter);
}

return (
<div id="options">
<button onClick={prevPage} id="next">
Back
</button>
<CardOption title={optionTitles.Option1} />
<CardOption title={optionTitles.Option2} />
<CardOption title={optionTitles.Option3} />
<p>{pageCounter}</p>
<button onClick={nextPage} id="next">
Next
</button>
<button onClick={printLog} id="next">
log
</button>
</div>
);
}
function CardOption(props) {
return (
<div className="card">
<h2>{props.title}</h2>
</div>
);
}

export default Options;

这是 useEffect Hook 的代码沙箱:https://codesandbox.io/s/thirsty-panini-mkdzh

最佳答案

useEffect 在每次状态更新时运行。确保将其依赖项设置为

useEffect(()=> {
// do stuff with pagecounter , which is updated count

},[pageCount])

如果您只想在安装时运行一次

useEffect(()=> {
// do stuff with pagecounter , which is initial count

},[])

useEffect 也在第一次渲染时运行,避免在初始渲染时运行它,例如

    const [pageCount, setPageCount] = useState(0)
useEffect(()=> {
if (pageCount===0){
//this prevent to run on first render
return
}
// code here will only run on updating state
},[pageCount])

关于javascript - 为什么 React-app 状态没有在这里重新渲染?如何让状态及时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60594876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com