2016-12-13 1 views
1

Я хочу SetState в AsyncStorage блока, но есть ошибка: неопределенное не является объект (оценка «this.setState»).Как установитьState в блоке AsyncStorage с ответом native?

constructor(props){ 
    super(props); 
    this.state={ 
     activeID:this.props.data.channel[0].id 
    }; 
} 

componentDidMount() { 
    AsyncStorage.getItem(this.props.data.type,function(errs,result){ 
     if (!errs) { 
      if (result !== null) { 
       this.setState({activeID:result}); 
      } 
     } 
    }); 
} 

_buttonPressed = (id,name,index) => { 
    this.setState({activeID:id}); 

    AsyncStorage.setItem(this.props.data.type,id,function(errs){ 
    if (errs) { 
     console.log('error'); 
    } 
    if (!errs) { 
     console.log('succeed'); 
    } 
}); 
} 

Любая помощь будет оценена, спасибо.

ответ

3

Это обязательная проблема. Попробуйте следующее:

componentDidMount() { 
    AsyncStorage.getItem(this.props.data.type, (errs,result) => { 
     if (!errs) { 
      if (result !== null) { 
       this.setState({activeID:result}); 
      } 
     } 
    }) 
} 

Причина этого заключается в том, что функции, объявленные с function спецификатора создать контекст своей собственной, то есть, значение this не экземпляр компонента. Но функции «жирная стрелка» не создают новый контекст, поэтому вы можете использовать все методы внутри. Вы могли бы также bind использовать функцию, чтобы сохранить контекст, но в этом случае я считаю, что это решение намного чище.

+0

Спасибо, я новичок, чтобы реагировать на native и js. Я нахожу другое решение, но это немного сложно. –

+0

Ваш тоже очень приятное решение, особенно если у вас есть много обещаний, прикованных один за другим: D – martinarroyo

0

Я нахожу другое решение, но Ответ martinarroyo гораздо более чист.

componentDidMount() { 
    this._loadInitialState().done(); 
} 

async _loadInitialState(){ 
    try{ 
     var value=await AsyncStorage.getItem(this.props.data.type); 
     if(value!=null){ 
      this._saveActiveID(value); 
     } 
    } catch(error){ 

    } 
} 
_saveActiveID(id) { 
    this.setState({activeID: id}); 
}