如何将一个对象更新为另一个具有相同结构的对象的值?
如何将一个对象更新为另一个具有相同结构的对象的值?
我试图从父函数中调用一个处理程序,并将更新后的状态值作为参数传递,然而,在调用setSelected之后,状态不会立即更新,因为两个控制台日志都打印出false(初始值)。然而,在onClick函数完成后,它会被更新。
onClick={() => { console.log("点击:", props.rank, props.suit, selected); setSelected(!selected); console.log("选中:", selected); // props.handle_card_selected(props.id, selected) }}
useEffect(() => { const check_border = () => { if (selected) { return "绿色"; } return "黑色"; }; check_border(); }, [selected]);
问题的出现原因是setState
是异步函数,所以它不会立即更新状态。解决方法是通过在setSelected
中传递函数来实现所需的行为。通过这种方法,可以避免直接调用setState
函数,而是通过返回新的状态值来更新状态。
代码中使用了onClick
事件处理函数来实现点击事件的响应。在点击事件的处理函数中,通过使用setSelected
函数来更新状态。通过传递一个函数给setSelected
,可以在函数中访问到前一个状态的值prevSelected
,并返回一个新的状态值!prevSelected
来更新状态。
另外,还使用了useEffect
来处理状态更新后的副作用。在useEffect
中,传入了一个函数和依赖项数组[selected, props.handle_card_selected]
。这样,当selected
或props.handle_card_selected
发生变化时,props.handle_card_selected
函数会被调用。
对于需要调用函数的情况,可以使用useEffect
来实现。这样可以避免在状态更新函数中执行副作用操作,这是一个不好的实践。
通过在setSelected
中传递函数以及使用useEffect
来处理副作用,可以实现将一个对象的值更新为另一个具有相同结构的对象的值。