React Native Firebase Ref () и усложнение навигации

Я использую firebase вместе с навигацией React для этого приложения.

Что касается моего компонента, я могу извлекать данные из моей базы данных firebase в реальном времени, чтобы заполнить массив компонентов. Это делается в моей функции componentDidMount ().

Однако если я перейду на другую страницу, а затем вернусь назад (функция goBack () не вызывается вручную), элементы не отображаются. Используя журналы консоли, я смог выяснить следующее:

-componentDidMount () вызывается снова, когда я повторно посещаю страницу.

-Я могу войти в функцию, указанную в:

Ref.on('value', (snap) => { .... });

поскольку я могу вызывать журналы консоли изнутри.

-состояния сбрасываются обратно к тому, что назначает конструктор, так как загрузка снова устанавливается в значение true.

Похоже, я просто не могу получить данные из firebase после первого вызова ref (). Ниже приведены важные аспекты моего кода.

export default class RestaurantPage extends Component<Props> {
  constructor(props){
    super(props);
    this.state = {
    showSearch:false,
    loading:true,
    index:0,
    data: []
  }
  this.rootRef = firebaseApp.database().ref();
  this.cards = [];
}

componentDidMount(){
var Ref = firebaseApp.database().ref("Restaurants");
Ref.on('value', (snap) => {
  var restaurants = snap.val();
  this.setState({data: Object.keys(restaurants)});
  console.info(this.state.data);
  var day = moment().format('dddd');
  for(var i = 0; i < this.state.data.length; i++){
    var newSnap = snap.child(this.state.data[i]);

    var id = newSnap.val()
    var name = newSnap.child('Name').val();
    var cuisine = newSnap.child('Cuisine').val();
    var price = newSnap.child('Price').val();
    var address = newSnap.child('Address').val();
    var closing = newSnap.child('Closing/' + day).val();
    var description = newSnap.child('Description').val();
    this.cards.push(
    <RestaurantCard key = {i}
                    id = {id}
                    title = {name}
                    cost = {price}
                    cuisine = {cuisine}
                    tags = {756}
                    closing  = {closing}
                    distance = {address}
                    description = {description}/>);
  }
  this.setState({loading:false});
});
}


renderCards = () => {
 console.info("rendercards called");
 return(
   {this.cards}
 );
 }

Кто-нибудь знает об этом?

Боковое примечание: никаких проблем не возникает, если я просто перехожу на другую страницу, а затем использую функцию goBack (), поскольку я считаю, что все состояния в любом случае сохраняются в этом случае. Дополнительно: я использую this.props.navigation.navigate (), а не push ().

ТАКЖЕ: кое-что, что может быть весьма важным: проблема возникает, когда я перехожу с одной страницы (Feed) на страницу, с которой у меня возникают проблемы (RestaurantPage). Затем я возвращаюсь к (Feed), используя свой navBar, а затем возвращаюсь к (RestaurantPage), после чего я вижу, что firebase ref () не работает.

Навигатор стека:

export default createStackNavigator(
  {
    RestaurantProfile: RestaurantProfile,
    RestaurantPage: RestaurantPage,
    SearchPage: SearchPage,
    SearchResults: SearchResults,
    Feed: Feed,
    OtherUserProfile: OtherUserProfile,
    OtherUserTags: OtherUserTags,
    PersonalTags: PersonalTags
  },
  {
    headerMode:'none',
    initialRouteName: 'Feed',
    transitionConfig: () => ({ screenInterpolator: () => null })
  },
);

Не могли бы вы показать код вашего навигатора стека? И почему вы не используете goBack (), если хотите сохранить состояния.

Prateek Surana 25.08.2018 14:28

Я не обязательно хочу сохранять состояния. При возврате к исходной странице было бы хорошо, если бы состояния пришлось перезагружать, поскольку в бэкенде все всегда может меняться. Я включил навигатор по стеку в исходный пост.

Josh 26.08.2018 00:16

Если вы можете войти в функцию под Ref.on('value', (snap) => { .... }); и по-прежнему не можете получить данные, то каков вывод console.info(this.state.data), на мой взгляд, вывод должен быть [] в обоих случаях, потому что this.setState() асинхронный, IMHO вы должны попробовать this.setState({foo:bar},()=>console.info("this.state.foo")), а затем посмотреть выход в обоих случаях.

Prateek Surana 26.08.2018 13:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
288
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, что я не вызвал off () в ссылке firebase после вызова on ()!

Решение состоит в том, чтобы вызвать Ref.off () в componentDidUnmount или просто использовать функцию Ref.once () вместо Ref.on ()

Другие вопросы по теме