1 回答

TA貢獻1785條經驗 獲得超4個贊
當您在 Firebase 中監聽某個值時,每次調用回調時,它都會獲取該位置所有數據的完整快照。因此,預計第二次您會收到新消息 ** 以及已經存在的所有消息。
因此,您需要忽略comments狀態中的當前值,并始終僅使用數據庫中的信息來填充它:
function retrieveComments(){
if(props.location.project){
var comments = firebase.database().ref('/projects/'+props.location.project.uid + '/' + props.location.project.pid+'/comments');
comments.once('value', (snapshot)=>{
let msgs = [];
snapshot.forEach((snap)=>{
msgs.push(snap.val());
})
setComments(comments => msgs);
})
}
}
順便說一句:我建議使用on()(而不是once()),因為這意味著 Firebase 將繼續偵聽數據庫的更改,并在有人發布或編輯評論時自動更新評論。
添加回答
舉報