(Снимок ReactAssign firebase для переменной вне функции - PullRequest
0 голосов
/ 14 марта 2019

Привет, я пытаюсь получить данные из моей базы данных, в componentDidMount (), она отлично работает с этим:

componentDidMount() {
  firebase.database().ref('/users/' + user.uid).once('value').then(function(snapshot) { 
      var valeur = snapshot.val();
      return valeur;
  });
  this.setState({userData:valeur});
}

Я просто хочу знать, как я могу присвоить эти данные переменной, которую можно использовать за пределами этой функции, я попытался установить и использовать переменную, которую я объявляю снаружи, ничего не получая, я получаю: реагирую на собственное возможное необработанное отклонение обещания (id 0 ) Ошибка типа: this.setState не является функцией. Спасибо

Ответы [ 3 ]

1 голос
/ 14 марта 2019

Вы должны установить setState внутри функции .then.

Затем вы можете получить доступ к своему значению с помощью this.state.userData.

. Оно будет неопределенным сразу после монтирования, а затем будет определено после разрешения вашей выборки, поэтомуинтегрировать механизм, который проверяет это.

Для вашей неопределенной проблемы простое решение будет таким, например:

render() {
    return (
      <View>{this.state.userData && this.state.userData.photo}</View>
    )
}

Редактировать: также, как указал Кай, я не уверен, что у вас естьдоступ к this экземпляру внутри .then обратного вызова, если вы не используете обозначение стрелки.

1 голос
/ 14 марта 2019
class Search extends React.Component {

  constructor(props) {
    super(props)
    this.state = {
      films: [],
      isLoading: false,
      userData: null
   }
   this.searchedText = ""
   this.localData=null;
  }



  componentWillMount() {

    user = firebase.auth().currentUser;

      firebase.database().ref('/users/' + user.uid).once('value').then(snapshot => {

      pro = snapshot.val()
      this.setState({userData: pro});

});


    this.setState({ isLoading: true })
    getFilmsFromApiWithSearchedText().then(data => this.setState({ films: data.results }))
      this.setState({ 
       films: data.results,
       isLoading: false
      })


      console.log(this.state.userData)
  }


  _displayLoading() {
    if (this.state.isLoading) {
      return (
        <View style={styles.loading_container}>
          <ActivityIndicator size='large' />
        </View>
      )
    }
  }

  _signOut() {
    firebase.auth().signOut();
  }

  _displayDetailForFilm = (idFilm) => {
    this.props.navigation.navigate("FilmDetail", { idFilm: idFilm })
  }

render() {
    return (
      <View style={styles.main_container}>
        <StatusBar
        hidden = {false}
        backgroundColor="#F1D145"
        ></StatusBar>
        <TouchableOpacity onPress={() => this._signOut()} style={styles.button} activeOpacity={0.8}>
          <Text style={styles.button_text}>Déconnexion</Text>
        </TouchableOpacity>
        <Text>{user.uid}</Text>

        <FlatList
        data={this.state.films}
        keyExtractor={(item) => item.id.toString()}
        renderItem={({item}) => <FilmItem film={item} displayDetailForFilm={this._displayDetailForFilm}/>}
        />
        {this._displayLoading()}
      </View>
    )
}
}


        this.setState({ isLoading: true })
        getFilmsFromApiWithSearchedText().then(data => this.setState({ films: data.results }))
          this.setState({ 
           films: data.results,
           isLoading: false
          })


          console.log(this.state.userData)
      }

Вот весь код, который я уже делаю console.log (this.state.userData) возвращает null

0 голосов
/ 14 марта 2019

Переключите анонимную функцию, которую вы передаете .then, на функцию стрелки, чтобы вы могли использовать this из области видимости класса.

Много информации в другом месте по этому

...