Javascript 为什么setstate不更新ReactJs中的值?
我正在我的应用程序中使用reactjs。currid_s最初设置为值-1。。稍后单击按钮后,将其设置为2,但计时器不会在控制台中显示更新的值。为什么? 这是密码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 =
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
的值。我应该在依赖项中添加所有这些吗?顺便说一句,这符合我的目的。。谢谢