发生了什么
初始状态为:
{button1:false,button2:false}
然后(通过changeItem)调用setClick(!Click.button1),它会设置一个新状态(false,因为!any_object 是false)。
然后你调用console.log(Click.button1) 记录false,因为初始状态的button1 属性是false。
然后触发重新渲染,创建包含新状态的新 Click 变量和关闭新 Click 变量的新 changeItem 函数。
下次您再次致电changeItem 时:
setClick(!Click.button1)
Click 是false 所以Click.button1 是undefined 所以你将状态设置为true。
然后console.log(Click.button1) 记录先前关闭的Click 的(false)button1 属性,即undefined,因为布尔值没有这些属性。
如何更新状态中对象的属性
您需要将一个新的对象分配给您只更改您关心的值的状态:
setState({
...Click, // Shallow copy all the old values
button1: !Click.button1, // Change the one you care about
})
如何观察变化
使用useEffect 钩子记录状态变化时的值:
useEffect( () => { console.log(Click); }, [Click] )
关于风格的说明
按照惯例,以大写字母开头的变量名是为构造函数和类保留的。不要使用它们来存储数据。叫它click。