当前位置: 首页 > 知识库问答 >
问题:

setState未合并但正在替换[重复]

席弘图
2023-03-14

我有些状态

  state = {
    theme: {
      background: { bgType: 'colour', value: '#449dc7' },
      primary: '#4d5a66',
      secondary: '#476480',
    },
  };

当我尝试更新嵌套属性,如background时,我调用setState如下所示

this.setState(prevState => ({
  ...prevState,
  theme: { background: { bgType: 'colour', value: color.hex } },
}));

然而,这只是将状态替换为

  theme: { background: { bgType: 'colour', value: color.hex } },

我就失去了其他财产

共有3个答案

田丰
2023-03-14

你必须传播主题对象:

this.setState(({ theme }) => {
  return { theme: { ...theme, background: { bgType: 'colour', value: color.hex } } };
});
祁烨
2023-03-14

同时展开内部对象

this.setState(prevState => ({
  ...prevState,
  theme: { 
    ...prevState.theme,
    background: { 
      ...prevState.theme.background,
      bgType: 'colour', value: color.hex
    }
  },
}));
澹台俊达
2023-03-14

如果您想在主题中只正确设置背景,您需要对主题使用扩展语法,而不是像状态一样使用扩展语法

this.setState(prevState => ({
  theme: { ...prevState.theme, background: { bgType: 'colour', value: color.hex } }
}));

如果你想把背景值也合并起来,你需要像这样分散它

this.setState(prevState => ({
  theme: { ...prevState.theme, background: { 
      ...prevState.theme.background, 
      bgType: 'colour', value: color.hex 
  }}
}));
 类似资料:
  • 我试图更新的值与中的的值,但它只更改的值,而不更新

  • 问题内容: 我有一个用例,我必须 如果键在ConcurrentHashMap中不存在,则插入一个新值 如果键已经存在于ConcurrentHashMap中,则新值将旧值替换为新值(其中新值是从旧值派生的(不是昂贵的操作)) 我提供以下代码: 您认为它是正确的并且是线程安全的吗? 有没有更简单的方法? 问题答案: 您可以使用下面与您的代码等效的代码来使其短一些。我已经对数以千计的线程进行并发访问进行

  • 操作步骤: 菜单栏: Refactor —> Find and Replace Code Duplicates...

  • 我对Android Studio有一个奇怪的问题。它没有找到对Google Play服务库的符号引用,如图所示: 我的文件如下所示: 奇怪的是,我可以在我的手机中构建甚至运行应用程序,没有任何问题。当我想使用库时,这个问题使得IDE和记事本一样有用。我该如何解决这个问题?

  • 我正在使用一个使用自己的Android:Theme的库,因此在构建时收到以下错误:错误:(55,9)任务':Contacit:ProcessDebugManifest'的执行失败。 清单合并失败:com.github.florent37:MaterialViewPager:1.0.3.2:11:18value=(@style/AppTheme)中也存在来自AndroidManifest.xml:4

  • 可能重复: 解析错误:语法错误,意外'(',期望','或';'中 我得到以下错误: 分析错误:语法错误,意外“.”,期待“,”或“;”在第19行的xxx中 在这一行: