[英]UseState, UseEffect not updating state in reactjs. I am trying to add random number to state
I am trying to add list of random number in numberArray
using useEffect
and useState
hooks, but I am console logging the result after the state is set in useEffect
method, but its not updating the state.我正在尝试使用
useEffect
和useState
挂钩在numberArray
添加随机数列表,但是在useEffect
方法中设置状态后,我正在控制台记录结果,但它没有更新状态。
import React, { useState,useEffect } from 'react';
const SortingTry = () => {
const [numberArray, setNumberArray] = useState([1,2,3,4,5]);
const ferin = () => {
var value = [];
var n = 100;
var min = 5;
var max = 500;
for (var i = 0; i < n; i++) {
value.push(Math.floor(Math.random() * (max - min + 1) + min));
}
return value;
}
useEffect(()=>{
const data = ferin();
setNumberArray([data]);
console.log(numberArray);
},[]);
return (
<h1>Generate Random Number</h1>
);
}
export default SortingTry;
setState is async that's why you can't see the state updated right after setState. setState 是异步的,这就是为什么在 setState 之后您看不到状态更新的原因。
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
const SortingTry = () => {
const [numberArray, setNumberArray] = useState([1, 2, 3, 4, 5]);
const ferin = () => {
var value = [];
var n = 100;
var min = 5;
var max = 500;
for (var i = 0; i < n; i++) {
value.push(Math.floor(Math.random() * (max - min + 1) + min));
}
return value;
};
useEffect(() => {
const data = ferin();
setNumberArray([data]);
}, []);
console.log(numberArray);
return <h1>Generate Random Number</h1>;
};
export default SortingTry;
Moving console.log() out of the hook should solve your problem.将 console.log() 移出钩子应该可以解决您的问题。 You can see the result in log.
您可以在日志中看到结果。
Check out https://codesandbox.io/s/dazzling-sinoussi-j42uu查看https://codesandbox.io/s/dazzling-sinoussi-j42uu
Remove your console.log and spread your data as you are passing array itself.删除您的 console.log 并在您传递数组本身时传播您的数据。
import React, { useState,useEffect } from 'react';
const SortingTry = () => {
const [numberArray, setNumberArray] = useState([1,2,3,4,5]);
const ferin = () => {
var value = [];
var n = 100;
var min = 5;
var max = 500;
for (var i = 0; i < n; i++) {
value.push(Math.floor(Math.random() * (max - min + 1) + min));
}
return value;
}
useEffect(()=>{
const data = ferin();
setNumberArray([...data]);
},[]);
return (
<h1>Generate Random Number</h1>
);
}
export default SortingTry;
Moving console.log(numberArray);
移动
console.log(numberArray);
out of useEffect()
hook will solve the issue.退出
useEffect()
钩子将解决这个问题。
As @kooskoos mentioned, setState()
is async that's why you can't see the state updated right after setState()
.正如@kooskoos 所提到的,
setState()
是异步的,这就是为什么您无法在setState()
之后看到状态更新的原因。
If you have no use for initial value [1,2,3,4,5]
in your numberArray state, you can also have a callback function inside your useState()
so that the random number array is populated as initial state, on the first render itself.如果您在 numberArray 状态中没有使用初始值
[1,2,3,4,5]
,您还可以在useState()
使用回调函数,以便随机数数组填充为初始状态,在首先渲染自己。
const [numberArray, setNumberArray] = useState(() => {
const n = 100;
const min = 5;
const max = 500;
return [...new Array(n)].map(() =>
Math.round(Math.random() * (max - min + 1) + min)
);
});
I'm using a slightly different logic here, but yours would work fine as well.我在这里使用了稍微不同的逻辑,但你的也可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.