【发布时间】:2025-12-02 00:15:01
【问题描述】:
我正在使用 Firebase Cloud Firestore 制作任务应用
我添加了一个 realtime listener 用于重新渲染平面列表,如果添加了任何新任务。
但我面临一个问题,即 state tasks = [] 被附加到 old state 上,这会导致平面列表中的任务重复。
我只想刷新整个列表。
这是我的实时监听器代码:
this.state = {
tasks: [],
};
fetchTasks() {
try {
this.setState({loading: true});
const uid = auth().currentUser.uid;
const tempTasks = [];
firestore()
.collection('Tasks')
.where('uid', '==', `${uid}`)
.onSnapshot(snapshot => {
snapshot.forEach(doc => {
console.log('realtime: ', JSON.stringify(doc.data(), null, 2));
tempTasks.push({
taskId: doc.id,
data: doc.data(),
});
});
this.setState({tasks: []});
this.setState({tasks: tempTasks, loading: false});
console.log('tasks: ', this.state.tasks.length);
});
} catch (e) {
this.setState({loading: false});
Alert.alert('Error fetching tasks', `${e}`, [{text: 'OK'}]);
console.log('err in realtime', e);
}
}
render() {
return (
<FlatList
data={this.state.tasks}
renderItem={this._renderItem}
keyExtractor={(item, index) => index.toString()}
/>
)
Final:添加任务后,任务 1 的副本也会出现,因为 tasks = [] 被附加在状态中,而不是同时刷新任务 1 和任务 2。
临时任务日志:
tempTasks [
{
"taskId": "FljhGGlsFN7yrD4GajDe",
"data": {
"status": "pending",
"createdOn": {
"_seconds": 1578761968,
"_nanoseconds": 66000000
},
"title": "Task 1",
"deadline": {
"_seconds": 1578761940,
"_nanoseconds": 0
},
"description": "apsdfplsdv",
"author": "yashGmail",
"uid": "t2kHrhIMbLggj2BpxKbJrPW9GL42"
}
},
{
"taskId": "GhF5nYalbTZZZH5j2lNO",
"data": {
"status": "pending",
"createdOn": {
"_seconds": 1578762188,
"_nanoseconds": 226000000
},
"title": "Task 2",
"deadline": {
"_seconds": 1578761940,
"_nanoseconds": 0
},
"description": "asdvlksdk",
"author": "yashGmail",
"uid": "t2kHrhIMbLggj2BpxKbJrPW9GL42"
}
}
]
非常感谢您的帮助。
【问题讨论】:
标签: reactjs firebase react-native google-cloud-firestore