Я использую AsyncStorage
в ComponentWillMount
, чтобы получить локально сохраненный accessToken
, но он возвращает обещание после выполнения функции render()
. Как я могу сделать render()
до тех пор, пока обещание не будет завершено? Спасибо.React Native AsyncStorage извлекает данные после рендеринга
ответ
Вы не можете сделать render
ждать, насколько я знаю. То, что я сделал в приложении, над которым я работаю, - это добавить экран загрузки, пока это обещание от AsyncStorage не будет устранено. Смотрите пример ниже:
import React, {
AsyncStorage,
View,
Text
} from 'react-native';
class Screen extends React.Component {
state = {
isLoading: true
};
componentDidMount() {
AsyncStorage.getItem('accessToken').then((token) => {
this.setState({
isLoading: false
});
});
},
render() {
if (this.state.isLoading) {
return <View><Text>Loading...</Text></View>;
}
// this is the content you want to show after the promise has resolved
return <View/>;
}
}
isLoading
Установка недвижимости на государственном объекте вызовет повторную визуализацию, а затем вы можете показать содержимое, которое опирается на маркере доступа.
На боковой ноте я написал небольшую библиотеку под названием react-native-simple-store, которая упрощает управление данными в AsyncStorage. Надеюсь, вы найдете ее полезной.
Это все еще работает в последней версии React Native? Я точно реализовал этот код, но он просто застрял на «Загрузка ...» навсегда. Если я запускаю консольный журнал рендера для отображения isLoading (без метода if), он возвращает false, а затем true, поэтому теоретически он должен работать. Но с помощью метода if он застрял на «Загрузка» навсегда, и журнал только возвращает false. – Hasen
У меня такая же проблема, как у Хасена выше. Моя функция render() никогда не вызывается во второй раз после обновления состояния. Таким образом, мой экран загрузки просто показывает неопределенно .... – Dygerati
У меня была такая же проблема, я продолжал застревать на экране загрузки. Кто-нибудь получил способ решить это? – DsEsteban
React-native основан на Javascript, который не поддерживает блокирующие функции. Также это имеет смысл, поскольку мы не хотим, чтобы пользовательский интерфейс застревал или казался невосприимчивым. Что вы можете сделать, это обработать это в функции рендеринга. У меня есть экран загрузки, повторно отображающий его, когда вы получаете информацию от AsyncStorage
Обновление переменной состояния будет «повторно отображать», что означает, что она снова вызовет функцию рендеринга. –
на основе реакции нативным doc, вы можете сделать что-то вроде этого:
import React, { Component } from 'react';
import {
View,
} from 'react-native';
let STORAGE_KEY = '@AsyncStorageExample:key';
export default class MyApp extends Component {
constructor(props) {
super(props);
this.state = {
loaded: 'false',
};
}
_setValue = async() => {
try {
await AsyncStorage.setItem(STORAGE_KEY, 'true');
} catch (error) { // log the error
}
};
_loadInitialState = async() => {
try {
let value = await AsyncStorage.getItem(STORAGE_KEY);
if (value === 'true'){
this.setState({loaded: 'true'});
} else {
this.setState({loaded: 'false'});
this._setValue();
}
} catch (error) {
this.setState({loaded: 'false'});
this._setValue();
}
};
componentWillMount() {
this._loadInitialState().done();
}
render() {
if (this.state.loaded === 'false') {
return (
<View><Text>Loading...</Text></View>
);
}
return (
<View><Text>Main Page</Text></View>
);
}
}
- 1. React-Native AsyncStorage для изображений
- 2. React Native ждет AsyncStorage перед экспортом
- 3. Обещания в AsyncStorage от React Native
- 4. React Native: напишите в AsyncStorage с java
- 5. React Native: попытка обновления компонента на основе данных из AsyncStorage
- 6. React-native: сохранить данные в памяти устройства
- 7. Как правильно getItem с AsyncStorage в React Native?
- 8. React Native - Нажать новый элемент (ы) на существующий ключ AsyncStorage?
- 9. Невозможно прочитать значение AsyncStorage при запуске приложения React Native
- 10. React Native AsyncStorage Getitem возвращает обещание не значение
- 11. Где Асинхронный хранилище React Native хранит данные?
- 12. React Native AsyncStorage: доступ к значению из объекта Promise
- 13. React Native - Как узнать, что хранится в AsyncStorage?
- 14. React Native AsyncStorage, сохраняющий значения, отличные от строк
- 15. Невозможно вернуть токен из AsyncStorage в React Native
- 16. Использование AsyncStorage для проверки Json Web Token in React Native
- 17. React Native - обновить значение ключа вложенного ключа AsyncStorage?
- 18. Почему React Native docs рекомендует использовать абстракцию поверх AsyncStorage?
- 19. React Native ListView строка без повторного рендеринга после изменения состояния
- 20. Сочетание React и React-Native
- 21. реакция native: функция рендеринга не вызывается после изменения состояния
- 22. React Native New Date string
- 23. Использование AsyncStorage + React Native для обновления содержимого RSS-ленты быстрее после загрузки inital
- 24. Сохранение конфиденциальных данных в React Native
- 25. Как безопасно хранить данные в iOS с помощью React Native?
- 26. response-native: Как использовать asyncstorage с rockdb?
- 27. Где React-Native AsyncStorage сохраняет данные на диске с помощью iPhone Simulator?
- 28. React-Native fetch XML-данные
- 29. React Native ListView не перезаписывает большие данные
- 30. React Native: принудительная перезагрузка TabBarIOS.item
Что именно вы пытаетесь сделать с данными? Один из способов обойти это - сохранить пустую переменную в функции getInitalState, а затем, когда AsyncStorage вернет значение, установите состояние с новым значением. –
Спасибо за вопрос, я получаю локально сохраненный доступ к Token из AsyncStorage, чтобы установить состояние. Но поскольку он возвращает обещание, функция render() запускается сначала, тогда состояние устанавливается сразу после. Поэтому я вижу страницу входа в систему (~ 0,1 с) каждый раз, когда я посещаю приложение, так как render() проверяет состояние и возвращает страницу входа в систему или основное приложение. – skleest
О, хорошо. Не знаете, как это исправить, кроме как, возможно, показывать сообщение загрузчика/загрузки, а затем заменить его либо именем входа, либо зарегистрированным в представлении. –