使用动态状态属性更新Firebase

时间:2017-08-14 13:41:16

标签: javascript reactjs firebase firebase-realtime-database

我有一个像这样的Firebase数据库结构:

-KrVtLbX7w8LKHC888cx
   siteInfo
      description: "Udemy is an online learning and teaching market..."
      siteName: "Udemy"
      title: "Udemy Online Courses - Learn Anything, On Your ..."
      type: "video_lecture"
      url: "https://www.udemy.com/"

这些siteInfo节点中的每一个都可能包含不同的密钥(即,一个可能没有type,另一个可能有img。这使得数据键相对动态,因此我无法在firebase.update中明确设置它们。

在前端,我有一个表单供用户编辑站点信息。表单在单个输入字段中显示数据,供用户根据用户选择的站点进行编辑,这样做效果很好。

我的问题是向用户更新的数据节点提交更新。

现在我正在为具有如下更改的输入设置状态:

  handleChange = ({target}) => {
    this.setState({
      [target.name]: target.value
    });
  }

并像这样更新节点:

   firebase.database().ref().child(`paths/${this.props.uid}/${key}`);
   let siteInfo = this.state;
   firebaseRef.update({
     siteInfo
   });

这样做是删除整个siteInfo节点并仅添加用户编辑过的那些字段。因此,不要只在更新描述的地方获取此信息:

-KrVtLbX7w8LKHC888cx
   siteInfo
      description: "The updated description!"
      siteName: "Udemy"
      title: "Udemy Online Courses - Learn Anything, On Your ..."
      type: "video_lecture"
      url: "https://www.udemy.com/"

我正在更新用户所做的修改,但其他所有内容都已删除:

-KrVtLbX7w8LKHC888cx
   siteInfo
      description: "The updated description!"
      siteName: "The updated site name!"

我希望它只更新那些已更新过的密钥。这是我对Firebase的.update方法应该如何工作的理解,但出于某种原因,它只是在这里覆盖了所有内容。

1 个答案:

答案 0 :(得分:0)

这对我来说实际上是一种非常愚蠢的错误。 State已经将数据作为对象提交,而不是这样做(使用额外的对象包装器):

   firebaseRef.update({
     siteInfo
   });

我应该这样做:

   firebaseRef.update(siteInfo);