Я пытаюсь получить значения внутри 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 на всех других экранах. Пожалуйста, помогите. Любая помощь будет очень ценной. Спасибо.





Проблема в том, что вы проверяете пользователя до того, как он будет добавлен в асинхронное хранилище. Причина, по которой он работает, когда вы нажимаете на элемент, заключается в том, что вы проверяете пользователя каждый раз, когда нажимается элемент списка. Вместо componentDidMount можно использовать componentWillUpdate. Я предполагаю, что когда вы нажмете на ящик, он обновит компонент, а затем проверит пользователя (поскольку React повторно отображает все поддерево компонентов).
надеюсь, это поможет
componentWillUpdate() {
AsyncStorage.getItem("user").then(value => {
this.setState({ name: value })
})
console.info(this.state.name);
}
Без проблем! Удачного кодирования!