我已經寫了一個基本的反應 + Firebase應用程序只是爲了確定它是如何工作的。React組件不在firebase child_update事件上重新呈現
我有返回基於從火力地堡數據庫中的組數據返回反應的組分(郵政)的列表的反應組分(ViewPosts)。
我已經附加child_removed的火力地堡事件,child_added和上componentDidMount()
child_changed所有這一切我安裝工作正常的事件,但只有child_changed事件不重新渲染頁面。但我添加了一個console.log
只是爲了檢查事件是否被觸發。 (我正在更新/刪除使用Firebase控制檯的值)
我認爲這可能是一個關鍵的問題,所以我甚至添加了一個索引,使其獨特但仍然沒有幸運。我在這裏錯過了什麼?爲什麼代碼給了我這種行爲。
由於React只更新更新的組件,即使我刪除了或向列表中添加了新組件,列表也不會更新,但是如果我刪除了一個組件並且該組件恰好位於更新組件之上(Post)那麼由於React被迫重新呈現該組件下方的列表,我可以看到更新後的值。
請幫我找出爲什麼發生這種情況
ViewPosts
import React, { Component } from 'react';
import * as firebase from 'firebase';
import Post from './Post';
var listItems = null;
var starCountRef = null;
class ViewPosts extends Component {
constructor(props) {
super(props);
this.state = {renderedList: []};
this.getDatafromDB = this.getDatafromDB.bind(this);
starCountRef = firebase.database().ref('posts');
}
getDatafromDB() {
listItems = [];
starCountRef.once('value', snapshot => {
var results = snapshot.val();
var resultsKeys = Object.keys(results);
listItems = resultsKeys.map((key,i) => <Post key={key.toString() + i} value={results[key].value + i } />);
this.setState({
renderedList : listItems
});
});
}
componentDidMount(){
// Get the data on a post that has been removed
starCountRef.on("child_removed", snapshot => {
var deletedPost = snapshot.val();
console.log("The post valued '" + deletedPost.value + "' has been deleted");
this.getDatafromDB();
});
// Get the data on a post that has been removed
starCountRef.on("child_added", snapshot => {
var addedPost = snapshot.val();
console.log("The post value '" + addedPost.value + "' has been added");
this.getDatafromDB();
});
starCountRef.on("child_changed", snapshot => {
var changedPost = snapshot.val();
console.log("The updated post value is " + changedPost.value);
this.getDatafromDB();
console.log("this.state.listItems " + this.state.renderedList);
});
}
render() {
return(
<div>
<ul>
{this.state.renderedList}
</ul>
</div>
);
}
}
export default ViewPosts;
後
import React, { Component } from 'react';
class Post extends Component {
constructor(props) {
super(props);
this.state = {value: props.value};
}
render() {
return(
<li>{this.state.value}</li>
);
}
}
export default Post;