React + Firebase v3 - 如何获得对 firebase 的第二次引用以更新单个项目
React + Firebase v3 - how to get a 2nd reference to firebase to update a single item
我正在尝试按照为 firebase v2 编写的 ToDo 教程学习 React+Firebase(使用 reactfire)。
现在使用新的 reactfire 文档,我了解了如何获取对 firebase v3 的引用,以便我可以列出和创建待办事项。
// app.jsx
var Firebase = require('firebase');
var Header = require('./header');
var config = {
apiKey: "...",
authDomain: "...firebaseapp.com",
databaseURL: "https://...firebaseio.com"
};
firebase.initializeApp(config);
var App = React.createClass({
...,
getInitialState(){ //... },
componentWillMount(){
var ref = firebase.database().ref("items");
this.bindAsObject(ref, "items");
ref.on('value', this.handleDataLoaded);
},
render: function() {
return (
<div>
...
<Header itemsStore={this.firebaseRefs.items}/>
...
</div>
)
}
但现在我想对单个项目执行 更新 操作,并被告知我必须仅使用该项目的 ID 创建一个新的 firebase 引用。
这还是真的吗?
这是我根据 docs.
尝试的结果
// list-item.jsx
componentWillMount(){
var ref = firebase.database().ref().child("items/" + this.props.item.key);
this.bindAsObject(ref, "item");
},
handleDoneChange(event){
console.log(this.state.item); // --------------------> Object {done: false, text: "second task", .key: "-KOlfbvw52_47CYiLlxr"}
this.setState({done:event.target.checked});
this.state.item.update({done: event.target.checked}); // --> is not a function
},
有没有可用的例子?
要更新特定项目,您确实需要获得对该特定项目的引用。您设置该参考的代码对我来说很好。
但是您不必调用 bindAsObject()
,除非您试图在 UI 的其他地方显示该特定对象。如果只想更新数据,直接更新数据库即可。 UI 中的现有项目列表将自动反映该更新。
看到这个snippet from the TODO example for ReactFire:
removeItem: function(key) {
var firebaseRef = firebase.database().ref('todoApp/items');;
firebaseRef.child(key).remove();
},
JSX:
<TodoList2 items={ this.state.items } removeItem={ this.removeItem } />
在您的代码中,更新代码可以简单地为:
handleDoneChange(key){
var ref = firebase.database().ref().child("items/")
ref.child(key).update({done: event.target.checked});
},
我正在尝试按照为 firebase v2 编写的 ToDo 教程学习 React+Firebase(使用 reactfire)。
现在使用新的 reactfire 文档,我了解了如何获取对 firebase v3 的引用,以便我可以列出和创建待办事项。
// app.jsx
var Firebase = require('firebase');
var Header = require('./header');
var config = {
apiKey: "...",
authDomain: "...firebaseapp.com",
databaseURL: "https://...firebaseio.com"
};
firebase.initializeApp(config);
var App = React.createClass({
...,
getInitialState(){ //... },
componentWillMount(){
var ref = firebase.database().ref("items");
this.bindAsObject(ref, "items");
ref.on('value', this.handleDataLoaded);
},
render: function() {
return (
<div>
...
<Header itemsStore={this.firebaseRefs.items}/>
...
</div>
)
}
但现在我想对单个项目执行 更新 操作,并被告知我必须仅使用该项目的 ID 创建一个新的 firebase 引用。
这还是真的吗?
这是我根据 docs.
尝试的结果// list-item.jsx
componentWillMount(){
var ref = firebase.database().ref().child("items/" + this.props.item.key);
this.bindAsObject(ref, "item");
},
handleDoneChange(event){
console.log(this.state.item); // --------------------> Object {done: false, text: "second task", .key: "-KOlfbvw52_47CYiLlxr"}
this.setState({done:event.target.checked});
this.state.item.update({done: event.target.checked}); // --> is not a function
},
有没有可用的例子?
要更新特定项目,您确实需要获得对该特定项目的引用。您设置该参考的代码对我来说很好。
但是您不必调用 bindAsObject()
,除非您试图在 UI 的其他地方显示该特定对象。如果只想更新数据,直接更新数据库即可。 UI 中的现有项目列表将自动反映该更新。
看到这个snippet from the TODO example for ReactFire:
removeItem: function(key) {
var firebaseRef = firebase.database().ref('todoApp/items');;
firebaseRef.child(key).remove();
},
JSX:
<TodoList2 items={ this.state.items } removeItem={ this.removeItem } />
在您的代码中,更新代码可以简单地为:
handleDoneChange(key){
var ref = firebase.database().ref().child("items/")
ref.child(key).update({done: event.target.checked});
},