2016-11-14 3 views
1

Реагировать сценарийReactNative: this.setState Ошибка: нуль не является объектом

class TransactionsList extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      activeAccountId: "", 
      accessToken: "", 
      TransactionsData: "", 
     }; 
    } 
    replaceRoute(route, passProps) { 
     this.props.replaceRoute(route, passProps); 
    } 
    async _getToken() { 
     try { 
      let accessToken = await AsyncStorage.getItem('AUTH_TOKEN'); 
      if(!accessToken) { 
       this.replaceRoute('login'); 
      } else { 
       this.setState({accessToken: accessToken}) 
      } 
     } catch(error) { 
      Alert.alert('Print Errorr', error.message) 
      this.replaceRoute('login'); 
     } 
    } 
    componentWillMount(){ 
     this._getToken() 
     let token = 'Token '+this.state.accessToken 
     this.load_data(token) 
    } 
    render() { 
     return (
      <Container> 
      // other code 
      </Container> 
     ) 
    } 
} 

Got ошибка в SetState в getToken ниже задвижка (ошибка) блокируют выход

Print Error null is not an object(evaluating prevComponentInstance._currentElement)

Но же выше код работает в других экранах.

+0

Возможно, вам нужно связать 'this' явно при вызове метода getToken' this._getToken(). Bind (this) ' –

+0

@BasimHennawi попытался добавить' this._getToken = this._getToken(). Bind (this) 'в методе конструктора. полученная ошибка setState может вызываться только на смонтированном компоненте. – ravigadila

+0

Точно вы можете изменить состояние (методом 'setState') на смонтированном компоненте, так или в конструкторе, или на' componentWillRecieveProps', если вы передадите свои реквизиты. –

ответ

0

Вы должны связать _getToken метод используя что-то вроде этого:

this._getToken().bind(this) 

Или вы можете сделать это в конструкторе для лучшего кода (я предпочитаю этот):

constructor(props) { 
    super(props); 
    this.state = { 
     activeAccountId: "", 
     accessToken: "", 
     TransactionsData: "", 
    }; 
    this._getToken() = this._getToken().bind(this) 
} 

Надеется, что это помогает

+0

добавил 'this._getToken = this._getToken(). Bind (this)' в методе конструктора. got Предупреждение: setState (...): может обновить только смонтированный компонент от монтажного компонента. – ravigadila

+0

Я думаю, что это может иметь какое-то отношение к асинхронному вызову, который вы делаете для получения токена. Хотя настройка состояния в компонентеWillMount разрешена и не должна давать предупреждения, я думаю, что в этом случае ваш код может уже войти в фазу рендеринга, когда результат маркера возвращается. Попробуйте перевести вызов this._getToken() в компонентDidMount(). – Jazib

1

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

Вместо этого вы должны сделать api calls в componentDidMount. Согласно documentation:

componentDidMount() is invoked immediately after a component is mounted. Initialization that requires DOM nodes should go here. If you need to load data from a remote endpoint, this is a good place to instantiate the network request. Setting state in this method will trigger a re-rendering.

И, вы также должны связать _getToken как уже упоминалось @Jazib.

Смежные вопросы