AsyncStorage getItem не работает в ящике с реагирующим собственным потоком маршрутизатора

Я пытаюсь получить значения внутри AsyncStorage в моем компоненте ящика. Я сделал условный рендеринг для отображения кнопок login и logout в ящике. Поэтому после успешного входа в систему, если в AsynStorage есть значения, кнопка внутри ящика должна быть Logout вместо Login .Но изначально после входа в систему, когда ящик открыт, значение AsyncStorage не получается. Оно получается, только если я нажимаю на определенный элемент в ящике. Итак, как мне получить значения в ящике, когда он открыт? Я сделал следующее

логин.js

async saveItem(item, selectedValue) {
    try {
      await AsyncStorage.setItem(item, selectedValue);
    } catch (error) {
      console.error('AsyncStorage error: ' + error.message);
    }
  }

...
....
...
.then((response) => response.json())
      .then((responseData) => {
        this.setState({
          login: responseData
        })
        if (responseData.status == true) {

          this.saveItem('userdetail', responseData.token.access_token);
          this.saveItem('userimage', responseData.user.avatar);
          this.saveItem('user', responseData.user.name);
          Actions.dashBoard();
          this.setState({ isLoading: false });

        } else {
....
}

ящик.js

componentDidMount() {
        AsyncStorage.getItem("user").then(value => {
            this.setState({ name: value })
        })
        console.info(this.state.name);
    }

onPressList = (data, index) => {
        AsyncStorage.getItem("user").then(value => {
            this.setState({ name: value })
        })
        if (this.state.name) {
            if (data.route == "profile")
                Actions.profile();
       ...
      ....
      ...
}
}

render(){
return(
{this.state.name? (
 <ListItem
                            button
                            noBorder
                            onPress = {() => this.onPressLogout()}
                        >

                            <Text style = {[styles.text, { textAlign: 'left' }]}>
                                Logout
                            </Text>

                        </ListItem>
) : (
 <ListItem
                            button
                            noBorder
                            onPress = {() => this.onPressLogin()}
                        >
                            <Text style = {[styles.text, { textAlign: 'left' }]}>
                                Login
                            </Text>

                        </ListItem>) }
)
}     

Здесь в ящике для каждого элемента списка я проверяю, установлен ли name или нет. Он будет перемещаться, только если name есть. Но проблема изначально внутри componentDidMount Я не получаю значения в AsyncStorage. Пожалуйста, помогите мне найти решение. Проблема существует только на боковой панели. Я получаю значения в AsyncStorage на всех других экранах. Пожалуйста, помогите. Любая помощь будет очень ценной. Спасибо.

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

Ответы 1

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

Проблема в том, что вы проверяете пользователя до того, как он будет добавлен в асинхронное хранилище. Причина, по которой он работает, когда вы нажимаете на элемент, заключается в том, что вы проверяете пользователя каждый раз, когда нажимается элемент списка. Вместо componentDidMount можно использовать componentWillUpdate. Я предполагаю, что когда вы нажмете на ящик, он обновит компонент, а затем проверит пользователя (поскольку React повторно отображает все поддерево компонентов).

надеюсь, это поможет

    componentWillUpdate() {
        AsyncStorage.getItem("user").then(value => {
            this.setState({ name: value })
        })
        console.info(this.state.name);
    }

Без проблем! Удачного кодирования!

Miguel Coder 18.02.2019 16:14

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