Так я бы конвертировал ваш компонент. Вы бы использовали функцию State () для создания своего состояния постов, а затем использовать useEffect довольно просто. Главное, в чем вы хотели бы убедиться, это то, что ваш массив зависимостей правильный, поэтому он не подписывается и не отписывается слишком часто (или недостаточно часто).
function PostsProvider(){
const [posts,setPosts] = useState([]);
useEffect(() => {
const unsubscribeFromFirestore = firestore
.collection('posts')
.onSnapshot(snapshot => {
const posts = snapshot.docs.map(collectIdAndDocs);
setPosts(posts);
});
return () => {
unsubscribeFromFirestore();
}
}, [])
}