简体   繁体   English

UseState, UseEffect 不更新 reactjs 中的状态。 我正在尝试将随机数添加到状态

[英]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.我正在尝试使用useEffectuseState挂钩在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM