如何将一个对象更新为另一个具有相同结构的对象的值?

14 浏览
0 Comments

如何将一个对象更新为另一个具有相同结构的对象的值?

我试图从父函数中调用一个处理程序,并将更新后的状态值作为参数传递,然而,在调用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]);

0
0 Comments

问题的出现原因是setState是异步函数,所以它不会立即更新状态。解决方法是通过在setSelected中传递函数来实现所需的行为。通过这种方法,可以避免直接调用setState函数,而是通过返回新的状态值来更新状态。

代码中使用了onClick事件处理函数来实现点击事件的响应。在点击事件的处理函数中,通过使用setSelected函数来更新状态。通过传递一个函数给setSelected,可以在函数中访问到前一个状态的值prevSelected,并返回一个新的状态值!prevSelected来更新状态。

另外,还使用了useEffect来处理状态更新后的副作用。在useEffect中,传入了一个函数和依赖项数组[selected, props.handle_card_selected]。这样,当selectedprops.handle_card_selected发生变化时,props.handle_card_selected函数会被调用。

对于需要调用函数的情况,可以使用useEffect来实现。这样可以避免在状态更新函数中执行副作用操作,这是一个不好的实践。

通过在setSelected中传递函数以及使用useEffect来处理副作用,可以实现将一个对象的值更新为另一个具有相同结构的对象的值。

0
0 Comments

在React中,有两件事情你需要知道关于状态更新:

1. 状态是异步更新的。

2. 在任何特定的渲染中,状态和属性不会改变;改变只会在组件重新渲染后反映出来。

如果你想要记录selected的更新值,将日志语句放在useEffect钩子中。

在同一个渲染中,你不能同时更新和记录任何状态变量的更新值;组件必须重新渲染以反映由状态更新引起的改变。

同样地,如果你想要使用selected的更新值调用一个函数,在useEffect钩子中调用该函数。

0