React useState hook 如何处理可变对象

Rob*_*b N 5 reactjs react-hooks

假设我的组件有一个状态,它是一组选定的 ID。Javascript 有一个Set类型,所以我试试这个:

let [selectedIDs, setSelectedIDs] = useState(new Set());
Run Code Online (Sandbox Code Playgroud)

JavascriptSet本身是可变的,所以我很困惑。

function toggleSelectedID(id) {
    let set = selectedIDs;
    if (set.has(id)) { set.delete(id) }
    else { set.add(id) }
    // ???
    setSelectedIDs(set);
}
Run Code Online (Sandbox Code Playgroud)

如果Set对象不可变,我将Set使用添加或删除的元素创建一个新元素,并将该新元素传递SetsetSelectedIDs,更改此时的状态。

但是对于 mutable Set,如果我们???在线路上返回会发生什么?React 是否会处于糟糕的状态,因为我“进入”了它的状态并在没有正式告诉它的情况下对其进行了变异setSelectedIDs

Den*_*ash 3

在您的示例中,setSelectedIDs不更新 application state

那是因为你设置了相同的引用,你应该复制一份:

setSelectedIDs(new Set(set));
Run Code Online (Sandbox Code Playgroud)

代码沙盒示例。


如果我们回到???会发生什么?线

什么都不会发生,你只是改变了函数中的一个变量,你可以随意执行多次。

当您希望您的 React-App 注意到更改时,您应该调用一个函数来更新状态 ( setSelectedIDs()) 并且您的应用程序将被重新渲染。

请参阅正确使用状态

  • 我想如果集合真的很大,并且我不想重新创建它,我可以通过让状态成为一个小包装对象来触发重新渲染,然后重新创建它。`set.add(x); setSelectedIDs({items: set})` (3认同)
  • @Mansuu ....请只问一个问题,您需要添加一些上下文和示例 (2认同)