【问题标题】:SetInterval is causing update state variables to default values in reactSetInterval 导致将状态变量更新为反应中的默认值
【发布时间】:2021-07-07 20:00:47
【问题描述】:

我正在尝试从我的数据库中获取值(比如 X ),并每 3 秒从 (X+2)、(X-2) 范围内显示一个新的随机数。

默认值为

//in Reducer (Initial State)
cprice : {
     "available":50,
     "taken" : 0,
     "total" : 50,
     "price" : 50
 }

数据库中的值是

    cprice : {
        "available":50,
        "taken" : 0,
        "total" : 50,
        "price" : 70
    }

但是当我运行我的代码时,我认为 SetInterval 会重新渲染组件并将 cprice 设置为默认值。这是我的代码:

  useEffect(() => {
    startGetCPrice()
  }, [])                 <= gets new values for cprice

  const [currentCPrice, setCurrrentCPrice] = useState(0);

  useEffect(() => {
      window.setInterval(() => {
        console.log(cprice.price)        <--- cprice.price is 50 here
        setCurrrentCPrice(currentCPrice => randomCPrice(cprice.price));
      },3000)
  },[])

  console.log(currentCPrice); <--- currentCPrice is random number near 50 here
  let randomCPrice = (crpt) => {
    console.log(crpt)                  <--- cprt is 50 here
    return Math.random()*4 + crpt -2 ;
  }
  console.log( cprice.price) <--- cprice.price is 70 here

我得到接近 50 的随机数,但我希望数据库中的值附近的随机数每 3 秒更新一次。

【问题讨论】:

    标签: reactjs react-redux react-hooks setinterval


    【解决方案1】:

    您的 useEffect 回调仅在第一次渲染时被调用(当 currentCPrice 为默认值时),这意味着 setCurrrentCPrice 中的先前状态不是最新的

    这应该可以解决您的问题

    useEffect(() => {
          const interval = window.setInterval(() => {
            console.log(cprice.price)        <--- cprice.price is 50 here
            setCurrrentCPrice(currentCPrice => randomCPrice(cprice.price));
          },3000)
          return ()=> clearInterval(interval)
    },[setCurrrentCPrice])
    

    【讨论】:

    • 感谢您的回答。您的回答为我指明了正确的方向。我实现了你的代码,仍然得到相同的结果。然后我将依赖数组中的setCurrentCPrice 替换为cprice.price 并得到了预期的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2019-08-29
    • 2020-10-19
    • 2020-09-19
    相关资源
    最近更新 更多