I’m new with react native. I’m using a flatlist to render data from firebase (v9).
Everything works well, there isn’t any error but, the list show only one item. After searching on differents topic, I think the problem is from the keyExtractor. But i don’t know how to solve it.
The Key Extractor from the code :
JavaScript
x
2
1
keyExtractor={item => item.id}
2
Here is the code :
JavaScript
1
55
55
1
const Liste = () => {
2
const [users, setUsers] = useState([]);
3
const [currentPage, setCurrentPage] = useState(1);
4
const [isLoading, setIsLoading] = useState(false);
5
6
const querySnapshot = await getDocs(collection(db, "form"));
7
querySnapshot.forEach((doc) => {
8
setUsers([users, doc.data()] );
9
});
10
}
11
12
const renderItem = ({ item }) => {
13
return(
14
15
<View>
16
<View>
17
<Text>{`${item.Address}`}</Text>
18
<Text>{`${item.Prix}`}</Text>
19
<Text>{`${id}`}</Text>
20
</View>
21
</View>
22
23
);
24
};
25
26
const renderLoader = () => {
27
return (
28
isLoading ?
29
<View style={styles.loaderStyle}>
30
<ActivityIndicator size="large" color="#aaa" />
31
</View> : null
32
);
33
};
34
35
const loadMoreItem = () => {
36
setCurrentPage(currentPage + 1);
37
};
38
39
40
return (
41
<View
42
<StatusBar backgroundColor="#000" />
43
<FlatList
44
data={users}
45
renderItem={renderItem}
46
keyExtractor={item => item.id}
47
ListFooterComponent={renderLoader}
48
onEndReached={loadMoreItem}
49
onEndReachedThreshold={0}
50
/>
51
</View>
52
)}
53
54
export default Liste;
55
Firestore :
The screen of the app :
Can you please help me ?? Thanks a lot !!
Advertisement
Answer
The recommended best practice is to run side effects like fetch data from server inside useEffect
hook.
JavaScript
1
61
61
1
const Liste = () => {
2
const [users, setUsers] = useState([]);
3
const [currentPage, setCurrentPage] = useState(1);
4
const [isLoading, setIsLoading] = useState(false);
5
6
const getUsers = async () => {
7
let result = [];
8
const querySnapshot = await getDocs(collection(db, "form"));
9
querySnapshot.forEach((doc) => {
10
result.push(doc.data());
11
});
12
13
setUsers([result]);
14
};
15
16
useEffect(() => {
17
getUsers();
18
}, []);
19
20
const renderItem = ({ item }) => {
21
return (
22
<View>
23
<View>
24
<Text>{`${item.Address}`}</Text>
25
<Text>{`${item.Prix}`}</Text>
26
</View>
27
</View>
28
);
29
};
30
31
const renderLoader = () => {
32
return isLoading ? (
33
<View style={styles.loaderStyle}>
34
<ActivityIndicator size="large" color="#aaa" />
35
</View>
36
) : null;
37
};
38
39
const loadMoreItem = () => {
40
setCurrentPage(currentPage + 1);
41
};
42
43
return (
44
<View>
45
<StatusBar backgroundColor="#000" />
46
<FlatList
47
data={users}
48
renderItem={renderItem}
49
keyExtractor={(item) => item.id}
50
ListFooterComponent={renderLoader}
51
onEndReached={loadMoreItem}
52
onEndReachedThreshold={0}
53
/>
54
</View>
55
);
56
};
57
58
export default Liste;
59
60
61