我有一个像这样的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
方法应该如何工作的理解,但出于某种原因,它只是在这里覆盖了所有内容。
答案 0 :(得分:0)
这对我来说实际上是一种非常愚蠢的错误。 State已经将数据作为对象提交,而不是这样做(使用额外的对象包装器):
firebaseRef.update({
siteInfo
});
我应该这样做:
firebaseRef.update(siteInfo);