#reactjs #firebase #react-native #google-cloud-firestore
# #reactjs #firebase #реагировать-родной #google-облако-firestore
Вопрос:
Я взял данные из firebase и хочу отобразить:
class DisplayVisit extends Component{
state = {
allVisit: [] //this I have changed
}
componentDidMount(){
this.getVisit();
}
getVisit = async() => {
try {
const currentVisit = await doctorvisit.get();
this.setState({ allVisit: currentVisit })
this.state.allVisit.forEach(element => {
console.log(element.data()) // i see data, fields like => {user, info, visitAt}
});
} catch(error) {
console.log('error getting visits ', error);
}
}
render(){
return(
{Object.keys(this.state.allVisit).map(key => (
<span>{this.state.allVisit[key].info}1</span>
))}
)
}
}
Но ничего не отображается.
Я тоже пробовал {key.info}
, но ничего не отображается.
Комментарии:
1. Привет! Вы получаете какую-либо ошибку в консоли?
2. когда я запускаю это
this.state.allVisit.forEach(element => { console.log(element.data()) // i see data, fields like => {user, info, visitAt} });
, я вижу данные. Мне просто нужно зациклить их наrender
3. проверьте, что вы получаете из console.log(element.data())
4. Я загрузил на экран вопроса с консоли
Ответ №1:
Если я вижу хорошо, вы устанавливаете для состояния allVisit значение currentVisit, которое является одним объектом.
Либо ваше свойство allVisit в состоянии представляет собой массив с объектами visit внутри, либо просто примените currentVisit в состоянии как единый объект.
В то же время, вы зацикливаете один объект, если это то, чего вы пытаетесь достичь, удалите .info после [key], и у вас будет отображаться все ваше свойство
Если вы хотите перебирать вложенные объекты или массив объектов, предоставьте дополнительную информацию
Обновление, я попытаюсь угадать ваши данные, поэтому попробуйте использовать этот код
export default class DisplayVisit extends Component {
state = {
allVisit: [] //this I have changed
};
componentDidMount() {
this.getVisit();
}
getVisit = async () => {
try {
const { docs } = await doctorvisit.get();
//try this if first not working
const allVisitsData = await doctor.visit.get()
this.setState({ allVisit: docs });
//try this if first not working
//this.setState({ allVisit: allVisitData.docs });
//or this
} catch (error) {
console.log("error getting visits ", error);
}
};
render() {
return (
<div>
{this.state.allVisit.map((visit) => (
<span key={visit.info}>{visit.info} 1</span>
))}
</div>
);
}
}
Комментарии:
1. когда я запустил это
{Object.keys(this.state.allVisit).map((key) => ( <p>{this.state.allVisit[key]}</p> ))}
, я получил сообщение об ошибке =Error: Objects are not valid as a React child (found: object with keys {S_, D_, bf, metadata, query}). If you meant to render a collection of children, use an array instead.
2. не могли бы вы, пожалуйста, зарегистрировать свой объект состояния после этого.setState({ allVisit: currentVisit }) и currentVisit пожалуйста
3. Я вижу, что здесь одна проблема stete =
{ allVisit: {} }
….. поэтому я меняю это наallVisit: []
4. Да, это имеет больше смысла, allVisit должен быть массивом visit , если это массив, который вы могли бы использовать только с помощью .map() , в противном случае, если у вас есть свойство состояния CurrentVisit с вложенным объектом visit, вам нужно использовать object.keys . дайте мне знать, как это происходит
5. когда я сделал то, что вы просили
console.log(this.props.allVisit);
в консоли, у меня естьundefined
…. так что setState неверно, но почему?
Ответ №2:
Я сделал это на основе документов Google:
class DisplayVisit extends Component{
state = {
allVisit: []
}
componentDidMount(){
this.getVisit();
}
getVisit = async() => {
try {
await doctorvisit.get().then(querySnapshot => {
const data = querySnapshot.docs.map(doc => doc.data());
this.setState({allVisit : data});
})
} catch(error) {
console.log('error getting visits ', error);
}
}
}
Документация:
https://firebase.google.com/docs/firestore/query-data/get-data?hl=en
и блог / сообщение:
Комментарии:
1. можете ли вы добавить документацию, которой вы следовали?