【发布时间】:2020-06-26 01:37:17
【问题描述】:
在反应中我正在使用功能组件,我有两个功能(getBooks)和(loadMore)
getBooks 从端点获取数据。但是,当我在getBooks 函数(loadMoreClicked)内单击按钮时调用loadMore 函数时,即使在延迟(5 秒)后调用它,它也会使用以前的状态。但是当我再次调用loadMore 时,状态发生了变化,一切正常。
有人可以解释为什么最初调用 (getBooks) 时的 (loadMoreClicked) 没有更新 甚至在延迟 5 秒后调用它。
function component() {
const [loadMoreClicked, setLoadMore] = useState(false);
const getBooks = () => {
const endPoint = `http://localhost/getBooks`; //this is my end point
axios
.get(endPoint, {
params: newFilters
})
.then(res => {
console.log(loadMoreClicked); //the (loadMoreClicked) value is still (false) after (5 sec)
})
.catch(err => {
console.log(err);
});
};
const loadMore = () => {
setLoadMore(true); //here i am changing (loadMoreClicked) value to (true)
setTimeout(() => {
getBooks(); // i am calling (getBooks()) after 5 seconds.
}, 5000);
};
return (
<div>
<button onClick={() => loadMore()}>loadMore</button> //calling (loadMore)
function
</div>
);
}
【问题讨论】:
-
国家不是这样运作的。状态仅在重新渲染时更新,因此
loadMoreClicked的值将始终为false,直到您的组件重新渲染。这不是等待它改变的情况。 -
但是当我在 loadMore 函数中调用 (setLoadMore(true)) 时,状态已经改变,组件应该重新渲染并且状态应该已经更新。之后,当我在 5 秒后调用 getBooks 时,getBooks应该已经改变了可用状态
-
如果我没记错组件应该在调用 setLoadMore(true) 时重新渲染并且状态应该已经更新。请回答
-
否,组件不能在函数中途重新渲染,否则函数将停止执行。当你调用
setLoadMore时,你实际上并没有设置状态——你只是告诉 React 你想要设置状态。 React 将在稍后组件重新渲染时执行此操作。当您仍在函数内时,组件不会重新渲染。 -
但是 getBooks 在 5 秒后被调用。它仍然没有对新更新值的引用。为什么会这样。该组件应该在 5 秒内重新渲染。但是 getBooks 中的 loadMoreClicked 更新值仍然为 false
标签: javascript reactjs react-functional-component use-state