Javascript ReactJS-“反应”;“设置状态”;使用react钩子,不会合并状态,而是替换状态

Javascript ReactJS-“反应”;“设置状态”;使用react钩子,不会合并状态,而是替换状态,javascript,reactjs,typescript,use-state,Javascript,Reactjs,Typescript,Use State,我有以下一段逻辑,关于带有useState的状态和Websocket端点流数据 const [state, setState] = React.useState({ items: [], activity: [] }); React.useEffect(() => { const currentItems = R.isNil(data.items) ? [] : data.items; const currentActivity = R.isNil(data.ac

我有以下一段逻辑,关于带有
useState
的状态和Websocket端点流数据

  const [state, setState] = React.useState({ items: [], activity: [] });

  React.useEffect(() => {
    const currentItems = R.isNil(data.items) ? [] : data.items;
    const currentActivity = R.isNil(data.activity) ? [] : data.activity;

    setState({
      ...state,
      items: Array.from(new Set([...state.items, ...currentItems])),
      activity: Array.from(new Set([...state.activity, ...currentActivity]))
    });
  }, [data]);

  console.log('State:', state); // This just replaces the state instead of merging.

但我不能让州合并。它只是每次用流中的新值替换状态。我错过了什么。我没怎么用钩子,但看起来很奇怪<代码>我正在传播状态,然后更新每个值。您能告诉我我做错了什么吗?

您可以使用useState hook中的回调函数来执行此操作:

setState(prev =>{
  ...prev,
  items: Array.from(new Set([...prev.items, ...currentItems])),
  activity: Array.from(new Set([...prev.activity, ...currentActivity]))
});

可以使用useState钩子中的回调函数执行此操作:

setState(prev =>{
  ...prev,
  items: Array.from(new Set([...prev.items, ...currentItems])),
  activity: Array.from(new Set([...prev.activity, ...currentActivity]))
});
“替换”到底是什么意思?如果你的意思是它们不是同一个物体,那是正常的。合并的状态应该是一个全新的对象,而不是具有突变的原始对象。也许从控制台添加日志?您所说的“替换”到底是什么意思?如果你的意思是它们不是同一个物体,那是正常的。合并的状态应该是一个全新的对象,而不是具有突变的原始对象。也许可以从控制台添加日志?