reactjs - 在 firebase 数据库上,Redux 复制存储中的最后一个数据
问题描述
我在 react-redux 上实现了网络聊天,使用 firebase 实时消息。Firebase 始终返回最后一个消息对象。当我刷新页面时,最后一个日期也被添加到商店中,最后一个对象在 redux 中重复。
我怎样才能正确地做到这一点,以便在更新页面后我会检查商店是否有重复的消息,然后不要将其添加到 redux 中?
消息.js
const userData = JSON.parse(localStorage.getItem("user-data"));
useEffect( () => {
if(userData.account_id) {
firebaseDB.ref().child(API.firebaseEnv + "/messages/messageItem" + userData.account_id)
.on("value", snap => {
const dataMessages = snap.val();
console.log(dataMessages)
setTimeout(() => {
firebaseGetMessages(dataMessages);
}, 2000);
});
}
}, []);
我试图在获取后删除会话,但是当我刷新页面时,所有数据都被删除了
firebaseDB.ref().child(API.firebaseEnv + "/messages/messageItem" + userData.account_id).remove()
动作.js
export const firebaseGetMessages = ( messages ) => (dispatch) => {
// console.log('action:', messages)
dispatch(firebaseMessageData(messages));
};
const firebaseMessageData = ( firebaseData ) => ({
type: "FIREBASE_SET_MESSAGE_DATA",
firebaseData
});
减速器.js
export default function messages ( state = [], action = {}) {
switch (action.type) {
case 'SET_MESSAGES_DATA':
return {
...state,
data: action.messages,
isLoading: false
};
case "FIREBASE_SET_MESSAGE_DATA":
// console.log('state:', state.data);
state.data.messages.push(action.firebaseData);
return {
...state,
};
default:
return state
}
}
解决方案
firebaseDB.ref().child
是stream
数据,它会在数据更改时自动触发。因此,每当您推送新数据时,它都会触发并调用回调。如果您想一次性读取数据,请使用once
该方法。示例如下
// 溪流
var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', function(snapshot) {
updateStarCount(postElement, snapshot.val());
});
// 一度
var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) {
var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
// ...
});
更多:https ://firebase.google.com/docs/database/web/read-and-write
推荐阅读
- python - Pandas:使用另一列作为源替换值
- react-native-android - React Native Android TV 专注于 Flatlist 项目
- azure - Azure 警报出站 ips
- javascript - 许多命名空间路径上的套接字 io.
- python - 我们能够修剪预训练的模型吗?示例:MobileNetV2
- html - 为 div 制作自己的滚动条
- airflow - 气流 - 如果传感器发生故障,则跳过 DAG
- java - java - 通过文件 URL 将文件发送到客户端,而不在服务器上下载
- javascript - 如何在 Duktape 中使用多个 js 文件?
- label - Grafana 热图:隐藏 y 轴标签