2 回答
TA贡献1789条经验 获得超8个赞
Flatlist可能会两次调用您的检索方法。因此,请务必使用loading道具以防止该方法运行。
onEndReached={(foo)=>{
if (this.state.loading === false){
this.makeAPizza(foo);
}
}}
TA贡献1877条经验 获得超6个赞
该查询获得相同的结果,因为它始终以相同的偏移量开始:startAt: 0。
要解决此问题,请保持pageNumber状态,在用户滚动时继续前进,然后startAt: pageNumber*6
关于代码的其他一些注释:状态可以简化...
this.state = {
data: [],
limit: 6,
// startAt removed. start at the end of data
loading: false
};
不需要retrieveMore。与相同retrieveUsers。 retrieveUsers可以简化...
// Retrieve Users
retrieveUsers = async () => {
try {
// Set State: Loading
this.setState({ loading: true });
// Firebase: Database + Settings
const db = firebase.firestore();
// Query
console.log('Fetching Users')
const query = await db.collection('users')
.where('company', '==', 'Google')
.orderBy('first_name')
.startAt(this.state.data.length)
.limit(this.state.limit);
// Query Snapshot
const querySnapshot = await query.get();
// Document Data
console.log('Document Data');
const documentData = querySnapshot.docs.map(document => document.data());
// console.log(documentData);
// Set State
this.setState({
data: [...this.state.data, ...documentData],
loading: false
})
}
catch (error) {
console.log(error);
}
};
注意,startAt计算为已检索到的数据的长度。这也适用于数据数组为空的情况。请注意,get第一个或第n个get的在之后更新状态的逻辑是相同的:将新数据追加到现有数据。
您不需要retrieveMore。与相同retrieveUsers。 retrieveUsers可以简化...
// ...
onEndReached={this.retrieveUsers}
添加回答
举报