【问题标题】:React - override state by exists object propertiesReact - 通过存在对象属性覆盖状态
【发布时间】:2019-12-22 19:05:15
【问题描述】:

我有使用空字符串初始化的属性的状态,因为我将它们放入表单输入中。另外,我从 Firebase 获取具有与状态匹配的属性但并非每个都存在的对象。如果属性存在,我将通过该对象的属性设置状态属性。

这是必要的例子:

class App extends Component {
  state = {
      user: {
        firstName: "",
        lastName: "",
        gender: "",
        address: {
          street: "",
          city: "",
          state: ""
        }
      }
  }
  componentDidMount(){
    const newObjectFromFirebase = {
      firstName: "Lucas",
      address: {
        city: "London"
      }
    }
    this.setState(newObjectFromFirebase);
  }
  render() {
    const stateJson = JSON.stringify(this.state);
    return (
      <div className="App">
      {stateJson}
      </div>
    );
  }
}

我想仅在来自 firebase 的对象中存在的这些属性中获取具有覆盖属性的状态。否则我想保持以前的状态。当前状态属性完全被新对象覆盖。

这就是我想要的:

user: {
        firstName: "Lucas",
        lastName: "",
        gender: "",
        address: {
          street: "London",
          city: "",
          state: ""
        }
      }

这就是我所拥有的:

user: {
        firstName: "Lucas",
        address: {
          city: "London",
        }
      }

任何智能解决方案或库?

【问题讨论】:

    标签: reactjs object state


    【解决方案1】:

    你可以像这样使用扩展语法...

    const newObjectFromFirebase = {
      firstName: "Lucas",
      address: {
        city: "London"
      }
    }
    this.setState(prevState => {
        user: {
            ...prevState.user,
            ...newObjectFromFirebase,
            address: {
                ...prevState.user.address,
                ...newObjectFromFirebase.address
            }
        }
    });
    

    这会将 2 个对象合并在一起并覆盖状态。

    【讨论】:

    • 没问题。如果您不知道对象的外观,您还可以使用 lodash 的 deepmerge 函数或 I wrote
    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 2020-06-23
    • 1970-01-01
    • 2021-03-16
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多