Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么setstate不更新ReactJs中的值?_Javascript_Reactjs_React Hooks_State - Fatal编程技术网

Javascript 为什么setstate不更新ReactJs中的值?

Javascript 为什么setstate不更新ReactJs中的值?,javascript,reactjs,react-hooks,state,Javascript,Reactjs,React Hooks,State,我正在我的应用程序中使用reactjs。currid_s最初设置为值-1。。稍后单击按钮后,将其设置为2,但计时器不会在控制台中显示更新的值。为什么? 这是密码 import React, { useState, useEffect } from "react"; export default function App() { const [currid_s, setcurrid_s] = React.useState(-1); const handless =

我正在我的应用程序中使用reactjs。currid_s最初设置为值-1。。稍后单击按钮后,将其设置为2,但计时器不会在控制台中显示更新的值。为什么? 这是密码

 
import React, { useState, useEffect } from "react";

export default function App() {
  const [currid_s, setcurrid_s] = React.useState(-1);
  const handless = () => {
    console.log("yess");
    setcurrid_s(2);
  };

  useEffect(() => {
    console.log(currid_s, "yes");
    getPosts();

    const interval = setInterval(() => {
      getPosts();
    }, 2000);

    return () => clearInterval(interval);
  }, []);

  // const all_pooo=()=>{
  //   console.log(curr,"dddd")
  // }
  const getPosts = async () => {
    console.log(currid_s);
  };
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <button onClick={handless}>gggg</button>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}


从“React”导入React,{useState,useffect};
导出默认函数App(){
const[currid\u s,setcurrid\u s]=React.useState(-1);
const handless=()=>{
控制台日志(“yess”);
setcurrid_s(2);
};
useffect(()=>{
console.log(currid_s,“yes”);
getPosts();
常量间隔=设置间隔(()=>{
getPosts();
}, 2000);
return()=>clearInterval(interval);
}, []);
//const all_pooo=()=>{
//控制台日志(当前,“dddd”)
// }
const getPosts=async()=>{
控制台日志(currid_s);
};
返回(
你好,代码沙盒
gggg
开始编辑,看看神奇的发生!
);
}
这里是代码沙盒的链接

您无法在
设置间隔中获取新的状态值,因为您正在间隔回调函数中存储旧版本的
getPosts

currid\s
更新时,会发生什么情况?应用程序组件会重新加载,并且一个新的
getPosts
函数会初始化,其中包含新值。但是,
setInterval
回调函数存储对包含旧值的旧
getPosts
函数的引用。此旧的
getPosts
函数将打印安装应用程序组件时分配的旧
currid\s
值的副本。Javascript不支持原语的引用,这就是旧的
getPosts
函数没有新值的原因

如果要在更新时打印您的
currid\u s
,只需执行以下操作:

useEffect(() => {
  console.log(currid_s)
}, [currid_s])

您可以将
currid\u s
useState()
更改为,以便可以从
setInterval
回调捕获的闭包中访问其值:

const{useRef,useffect}=React;
函数App(){
const currid_s=useRef(-1);
const handless=()=>{
电流=2;
};
useffect(()=>{
const getPosts=()=>{
控制台日志(当前版本);
};
getPosts();
常量间隔=设置间隔(()=>{
getPosts();
}, 2000);
return()=>{
间隔时间;
};
}, []);
返回(
你好,代码沙盒
点击我
开始编辑,看看神奇的发生!
);
}
ReactDOM.render(,document.getElementById('root'))


interval的回调函数在设置计时器interval时生效的
currid\u s
值上有一个闭包。每当更新
currid\s
时,您需要设置一个新的间隔。您可以通过在
useffect
hook的依赖项数组中添加
currid\s
来实现此目的。@Yousaf但是间隔如何影响currid\s值?您可以在codesandbox@Yousaf中更改吗?@TusharShahi您的意思是什么<代码>设置间隔
未更改其值;它只调用一个函数,即
getPosts
,该函数记录
currid\s
的值。我应该在依赖项中添加所有这些吗?顺便说一句,这符合我的目的。。谢谢