React Native с TypeScript this.setState не является функцией

В настоящее время я использую React Native 0.39.2 с новейшим TypeScript, и когда я запускаю метод componentDidMount() и setState, я получаю сообщение об ошибке this.setState не является функцией.

Я пытался связать с this.setState({isLoggedIn: true}).bind(this)

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

вот мой код

Сначала с моим интерфейсом для состояния

import React, {
 Component
} from 'react';
import { AppRegistry, View, StyleSheet, Text } from 'react-native';
import { Actions } from 'react-native-router-flux';

import Firestack from 'react-native-firestack';

const firestack = new Firestack();

interface Props {

}

interface State {
  isLoggedIn?: boolean;
}


export default class MainList extends Component<Props, State> {

   state = {
     isLoggedIn: false,
   };

   constructor(props: any) {

      super(props);
      console.log("Is anyone logged in?: " + this.isLoggedIn);

   }

   isLoggedIn = this.state.isLoggedIn;

   componentDidMount() {

      if (!this.isLoggedIn) {

          Actions.welcome();

      }

      firestack.auth.listenForAuth(function(evt: any) {
      // evt is the authentication event
      // it contains an `error` key for carrying the
      // error message in case of an error
      // and a `user` key upon successful authentication

        if (!evt.authenticated) {
        // There was an error or there is no user
        //console.error(evt.error);

        this.setState({isLoggedIn: false});
        console.log("The state of isLoggedIn is: " +       this.isLoggedIn);

        } else {
        // evt.user contains the user details
        console.log('User details', evt.user);

        this.setState({isLoggedIn: true});
        console.log("The state of isLoggedIn is: " + this.isLoggedIn);

        }


    }); 

}

render() {

    return (
        <View style={styles.View}>

            <Text style={styles.textLabel}>The main view</Text>

        </View>
     )

   }

 }

 const styles = StyleSheet.create({

 View: {
    padding: 20
 },
 textLabel: {
    fontSize: 20,
    marginBottom: 10,
    height: 20
 },
 textInput: {
    height: 20,
    fontSize: 15,
    marginBottom: 20
  }

});

AppRegistry.registerComponent('MainList', ()=> MainList);

Есть ли что-то, что мне здесь не хватает?


person Mike P    schedule 24.12.2016    source источник
comment
выложи весь свой файл. как вы объявляете свой класс?   -  person bluetoft    schedule 24.12.2016
comment
похоже, вы многое упускаете   -  person Maxwelll    schedule 24.12.2016


Ответы (1)


Проблема в том, что в функции обратного вызова для listenForAuth this больше не относится к объекту MainList.

Попробуйте переключиться на выражение функции стрелки, которое решает проблему привязки this:

firestack.auth.listenForAuth((evt: any) => {
  ...
});

Здесь полезно прочитать, если вы хотите знать больше о функции стрелки.

person max23_    schedule 24.12.2016
comment
большое спасибо :-) я должен был это понять, но я забыл упомянуть, что я немного новичок, но это очень помогло, особенно ссылка на справку в конце! - person Mike P; 24.12.2016
comment
Пожалуйста! Есть несколько других решений (например, bind(this) или var that = this;), но мне намного проще использовать функцию стрелки (которая была введена в ES6). - person max23_; 24.12.2016
comment
я бы сделал var that = this; вне определения класса, если бы я собирался это сделать? - person Mike P; 24.12.2016
comment
Вы можете определить var that = this; внутри функции componentDidMount(), затем вы можете использовать that.setState() в функции обратного вызова. - person max23_; 25.12.2016