首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在将变量null添加为object属性之前检查其是否为空?

如何在将变量null添加为object属性之前检查其是否为空?
EN

Stack Overflow用户
提问于 2019-05-05 14:45:08
回答 2查看 1.6K关注 0票数 0

所以我有个密码:

代码语言:javascript
复制
let resetElementOnLiveEdit = null
    if(liveEdit){
      if(!profile in liveEdit)
        resetElementOnLiveEdit = {
          [Object.keys(liveEdit)[0]]: liveEdit[Object.keys(liveEdit)[0]]
        }
    }

请注意resetElementOnLiveEdit变量。默认情况下,它是,那么我就有条件了。

然后我试着设定这样的状态:

代码语言:javascript
复制
this.setState({
      profiles: {
        ...this.state.profiles,
        [profile]: profileCopy,
        resetElementOnLiveEdit
      },
      liveEdit: saveBeforeEdit
    })

如您所见,在配置文件对象中,我在setState方法中包括了setState

问题是,如何像我描述的那样在setState方法中包含这个变量,除非它不是

因为现在我有空支柱在状态:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-05 14:51:48

首先,您破坏了主要的反应规则之一:因为状态更新是异步的。,如果您基于现有状态(...this.state.profiles)设置状态,则必须使用setState的回调版本(因此您没有使用陈旧状态)。所以你的代码是:

代码语言:javascript
复制
this.setState(({profiles}) => ({
  profiles: {
    ...profiles,
    [profile]: profileCopy,
    resetElementOnLiveEdit
  },
  liveEdit: saveBeforeEdit
}));

如果你根本不想拥有房产,最好的办法是把它分开:

代码语言:javascript
复制
this.setState(({profiles}) => {
  var newState = {
    profiles: {
      ...profiles,
      [profile]: profileCopy
    },
    liveEdit: saveBeforeEdit
  };
  if (resetElementOnLiveEdit !== null) {
    newState.profiles.resetElementOnLiveEdit = resetElementOnLiveEdit;
  }
  return newState;
});

但是,如果您愿意,您可以扩展一个对象,并选择一个空白的对象或一个具有以下属性的对象:

代码语言:javascript
复制
this.setState(({profiles}) => ({
  profiles: {
    ...profiles,
    [profile]: profileCopy,
    ...(resetElementOnLiveEdit === null ? {} : {resetElementOnLiveEdit})
  },
  liveEdit: saveBeforeEdit
}));

从理论上讲,这意味着你正在创建一个对象,展开它,然后扔掉它。但这不太可能是一条关键的表演之路.

票数 0
EN

Stack Overflow用户

发布于 2019-05-05 14:53:16

您可以在代码之前创建profiles对象,并且只有在null时才能设置它:

代码语言:javascript
复制
const profiles = { 
  ...this.state.profiles,
  [profile]: profileCopy,
};
if (resetElementOnLiveEdit) {
  profiles.resetElementOnLiveEdit = resetElementOnLiveEdit;
}
this.setState({
  profiles,
  liveEdit: saveBeforeEdit
});

或者,如果你必须在一个班轮中这样做,你可以:

代码语言:javascript
复制
this.setState({
  profiles: {
    ...this.state.profiles,
    [profile]: profileCopy,
    ...(resetElementOnLiveEdit ? { resetElementOnLiveEdit } : {})
  },
  liveEdit: saveBeforeEdit
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55993162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档