AsyncStorage
AsyncStorage — асинхронное хранилище ключ-значение. Аналог localStorage, но асинхронный.
Установка
npx expo install @react-native-async-storage/async-storage
Базовые операции
import AsyncStorage from '@react-native-async-storage/async-storage';
// Сохранить
await AsyncStorage.setItem('theme', 'dark');
// Прочитать
const theme = await AsyncStorage.getItem('theme');
// Удалить
await AsyncStorage.removeItem('theme');
// Очистить всё
await AsyncStorage.clear();
Все методы асинхронные. Всегда await.
Объекты
Хранит только строки. Объекты — через JSON:
await AsyncStorage.setItem('user', JSON.stringify(user));
const user = JSON.parse(await AsyncStorage.getItem('user') ?? 'null');
Или через хук:
function useAsyncStorage<T>(key: string, initial: T) {
const [value, setValue] = useState<T>(initial);
useEffect(() => {
AsyncStorage.getItem(key).then((stored) => {
if (stored) setValue(JSON.parse(stored));
});
}, [key]);
const update = useCallback(async (newValue: T) => {
setValue(newValue);
await AsyncStorage.setItem(key, JSON.stringify(newValue));
}, [key]);
return [value, update] as const;
}
Несколько операций
await AsyncStorage.multiSet([
['key1', 'value1'],
['key2', 'value2'],
]);
const values = await AsyncStorage.multiGet(['key1', 'key2']);
// [['key1', 'value1'], ['key2', 'value2']]
await AsyncStorage.multiRemove(['key1', 'key2']);
Все ключи
const keys = await AsyncStorage.getAllKeys();
Что хранить
- Настройки (тема, язык)
- Онбординг (пройден ли)
- Кеш данных
- Черновики
- История поиска
Что не хранить
- Токены — используй
SecureStore - Пароли — никогда
- Персональные данные — шифруй или не храни
- Большие объёмы — есть лимиты
SecureStore для токенов
npx expo install expo-secure-store
import * as SecureStore from 'expo-secure-store';
await SecureStore.setItemAsync('token', token);
const token = await SecureStore.getItemAsync('token');
await SecureStore.deleteItemAsync('token');
Keychain (iOS) / Keystore (Android). Безопасно.
Разница:
- AsyncStorage — обычное хранилище, не защищено
- SecureStore — шифрование, системная защита
MMKV
Альтернатива с лучшей производительностью:
npm install react-native-mmkv
import { MMKV } from 'react-native-mmkv';
const storage = new MMKV();
storage.set('theme', 'dark');
const theme = storage.getString('theme');
storage.delete('theme');
Синхронный, быстрый, но не для Expo Go (нужен dev client).
Если ты уже знаешь React
localStorage в вебе синхронный. AsyncStorage — асинхронный. Всегда await.
Итоги
AsyncStorageдля настроек и кешаSecureStoreдля токенов- Только строки — объекты через JSON
- Все методы асинхронные
MMKVдля производительности- Не храни пароли и чувствительные данные