reactjs - UseEffect 无限执行
问题描述
我使用 useEffect 挂钩通过调用另一个函数 getData 从数据库中获取数据,当我收到数据时我会更新状态。
const [employees, setEmployees] = useState([])
const [shownEmployees, setShownEmployees] = useState([])
const [nbrPages, setNbrPages] = useState(0)
const getData = () => {
axios.request(options).then((response) => {
setEmployees(response.data)
setShownEmployees(response.data.slice(0, nbrItems))
response.data.length%nbrItems > 0 ? setNbrPages((response.data.length/nbrItems)+1) : setNbrPages(response.data.length/nbrItems)
console.log(nbrPages)
}).catch((error) => console.log(error))
for(let i=0;i<nbrPages;i++){
pages_temp.push(i)
}
console.log(pages_temp.length)
setPages(pages_temp)
}
useEffect(() => {
getData()
},[])
问题nbrPages
一直是 0,但是当我将employees
useEffect 作为依赖项时,useEffect 执行了很多次,但这次nbrPages
是 bieng 计算的。谁能解释这种行为,我已经尝试了每一件事。本质上,我想了解为什么useEffect
当我将其employees
作为依赖项提供时会无限执行,在什么时刻employees
发生变化,因此它触发了 useEffect 钩子。
解决方案
发生这种情况是因为您正在employees
从 getData 方法更新状态。
setEmployees(response.data)
也就是说employees
,每次更新员工时都会调用 useEffect 。
更新:看来您的问题与 useEffect 无关。你可以调试你的代码,看看此时发生了什么,
response.data.length%nbrItems > 0 ? setNbrPages((response.data.length/nbrItems)+1) : setNbrPages(response.data.length/nbrItems)
您可以将此部分重写为,
console.log(response.data.length);
console.log(nbrItems);
console.log(response.data.length % nbrItems);
if(response.data.length % nbrItems) {
let temp = (response.data.length/nbrItems)+1;
console.log('Temp:', temp);
setNbrPages(temp);
} else {
console.log('Inside else block');
let temp = response.data.length/nbrItems;
console.log('Inside else temp:', temp);
setNbrPages(temp);
}
并查看控制台日志是什么,并确定您的值是否合适。
Update2:您可以使用另一个 useEffect 来解决您的问题。
const [employees, setEmployees] = useState([])
const [shownEmployees, setShownEmployees] = useState([])
const [nbrPages, setNbrPages] = useState(0)
const getData = () => {
axios.request(options).then((response) => {
setEmployees(response.data)
setShownEmployees(response.data.slice(0, nbrItems))
response.data.length%nbrItems > 0 ? setNbrPages((response.data.length/nbrItems)+1) : setNbrPages(response.data.length/nbrItems)
console.log(nbrPages)
}).catch((error) => console.log(error))
}
useEffect(() => {
getData()
},[])
useEffect(() => {
for(let i=0;i<nbrPages;i++){
pages_temp.push(i)
}
console.log(pages_temp.length)
setPages(pages_temp)
},[nbrPages]);
推荐阅读
- angular - Angular 形式的 Laravel CSRF 令牌
- c - 如何初始化 GNU C 全局寄存器变量
- javascript - 如何在每次迭代之前重置变量?
- r - 根据列号替换列中的值
- flutter - 模糊图像,文字覆盖在颤动中
- elasticsearch - 统计所有文档中指向特定字段的总字数
- typescript - Hyperledger TypeError: Class extends value undefined is not a function or null
- java - 如何隐藏数据透视表中的特定列而不是工作表?
- c# - 使用 XGraphics 时如何解决“无法从字符串 [] 转换为字符串”错误
- cakephp - CakePHP 3 基于会话配置显示会话超时时间