Reactjs 什么';setCount(prev=>;prev+;1)和setCount(count+;1)之间的区别是什么?

Reactjs 什么';setCount(prev=>;prev+;1)和setCount(count+;1)之间的区别是什么?,reactjs,Reactjs,我正在读一个React钩子的例子。我发现他们在写作 setCount(count + 1) 但我通常是这样写的 setCount(prev => prev + 1) 有什么区别吗?哪一个更好?嗯,这取决于情况 如果要更新其值依赖于前一状态的状态,则应使用以下命令 setCount(prev => prev + 1); 这会将状态更新为新状态 如果像下面这样使用,那么它将更新计数一次,而不是两次,因为setState本质上是异步的 setCount(count + 1); set

我正在读一个React钩子的例子。我发现他们在写作

setCount(count + 1)
但我通常是这样写的

setCount(prev => prev + 1)

有什么区别吗?哪一个更好?

嗯,这取决于情况

如果要更新其值依赖于前一状态的状态,则应使用以下命令

setCount(prev => prev + 1);
这会将状态更新为新状态

如果像下面这样使用,那么它将更新计数一次,而不是两次,因为
setState
本质上是异步的

setCount(count + 1);
setCount(count + 1);
但是如果你这样做

setCount(count => count + 1);
setCount(count => count + 1);
然后它将更新状态两次,就像我们从以前的状态更新状态一样

const{useState}=React;
常量示例=()=>{
const[count,setCount]=useState(0);
常量handleClick=()=>{
setCount(count=>count+1);
setCount(count=>count+1);
}
报税表(
{count}

加2 ); }; ReactDOM.render( ,document.getElementById(“react”) );
我复制了React Hook的注释 与类组件中的setState方法不同,useState不会自动合并更新对象。通过将函数更新程序窗体与对象扩展语法相结合,可以复制此行为:

setState(prevState => {
  // Object.assign would also work
  return {...prevState, ...updatedValues};
});

另一个选项是useReducer,它更适合于管理包含多个子值的状态对象。

在大多数情况下,它们正在执行相同的任务

但当你的反应成分变得超级复杂时,第二个更好。因为在第一种情况下,如果您有许多
setState()
队列,那么
count
是不可靠的。这可能是一些你没有预料到的价值
setCount(prev=>prev+1)
始终在其先前值的基础上添加1,这样更可靠


实际上,您可以将
(previousValue,props)
作为参数传递给
setState()

有一个区别,第一个区别是,计数将基于由于函数中的关闭而发生渲染时的当前值

第二个始终使用增量的最新值

因为闭包是一个复杂的主题,这里有一些例子。第一部分显示了两者之间的主要区别

第二个例子展示了几种方法,它们可以让闭包和效果/挂钩正常工作

const{useState,useffect}=React;
函数示例(){
const[count1,setCount1]=useState(0);
useffect(()=>{
设置计数1(计数1+1);
设置计数1(计数1+1);
设置计数1(计数1+1);
},[])
const[count2,setCount2]=useState(0);
useffect(()=>{
setCount2(prev=>prev+1);
setCount2(prev=>prev+1);
setCount2(prev=>prev+1);
},[])
返回
count1和count2都有3个增量。

count1保持为1,因为useEffect中的count1变量不会因useEffect中的arrow函数中的闭包而更改
当前计数1:{count1}
当前计数2:{count2} } ReactDOM.render(,document.getElementById('root'))

@Adicia,第一个带有“保修”,第二个带有“保修”。设置状态((以前的值,道具)=>{})是一个类组件特性,而不是
useState
hook特性。