Что такое AsyncStorage и зачем он нужен
AsyncStorage — это система для локального хранения данных в формате "ключ-значение" в приложениях React Native. Можно думать о нем, как о версии localStorage, только для мобильных устройств. Как и localStorage, он используется для небольших объемов данных, но в отличие от него, работает асинхронно. Ключевые примеры использования AsyncStorage включают:
- Сохранение данных пользователя. Представьте, что в вашем приложении нужно сохранять токены авторизации или пользовательские настройки.
- Подгрузка состояния после перезапуска. Например, состояние корзины в интернет-магазине или последний открытый экран.
- Кэширование данных API. Это позволяет уменьшить количество запросов к API и улучшить пользовательский опыт.
Преимущества AsyncStorage
- Простота использования. API интуитивно понятен, и операции вроде записи/чтения данных являются довольно простыми.
- Асинхронность. Большинство операций выполняются асинхронно, что уменьшает нагрузку на главный поток приложения.
- Кроссплатформенность. Он работает как на Android, так и на iOS.
Ограничения AsyncStorage
Несмотря на преимущества, у AsyncStorage есть свои минусы:
- Размер хранилища. Подойдет только для небольших объемов данных, например, конфигураций или токенов.
- Не подходит для большого объема данных. Если вы работаете с большими массивами данных, лучше использовать специализированные библиотеки вроде SQLite.
Установка и настройка библиотеки AsyncStorage
Раньше AsyncStorage был встроенным в React Native, но с определенного момента он стал отдельной библиотекой. Установим его в наш проект:
Установка
Установим библиотеку через npm:
npm install @react-native-async-storage/async-storageЗатем сделаем
pod install, если работаем с iOS:cd ios && pod installГотово! Теперь можно использовать
AsyncStorageв нашем проекте.
Основные методы AsyncStorage
Работа с AsyncStorage выполняется через три основные функции:
setItem(key, value)— сохраняет данные под указанным ключом.getItem(key)— извлекает данные по ключу.removeItem(key)— удаляет данные по ключу.
Каждый из них возвращает промис, так что, будьте готовы к асинхронной обработке.
Пример использования AsyncStorage
Давайте попробуем реализовать простую функциональность сохранения и извлечения данных. Представьте, что мы создаем приложение для заметок, где пользователь может сохранить текст локально.
Сохранение данных
import AsyncStorage from '@react-native-async-storage/async-storage';
const saveNote = async (note: string) => {
try {
await AsyncStorage.setItem('userNote', note); // Сохраняем заметку под ключом 'userNote'
console.log('Заметка сохранена!');
} catch (error) {
console.error('Ошибка сохранения заметки:', error);
}
};
Извлечение данных
const getNote = async () => {
try {
const savedNote = await AsyncStorage.getItem('userNote'); // Извлекаем заметку по ключу 'userNote'
if (savedNote !== null) {
console.log('Извлеченная заметка:', savedNote);
return savedNote;
}
} catch (error) {
console.error('Ошибка извлечения заметки:', error);
}
};
Удаление данных
const deleteNote = async () => {
try {
await AsyncStorage.removeItem('userNote'); // Удаляем заметку из хранилища
console.log('Заметка удалена!');
} catch (error) {
console.error('Ошибка удаления заметки:', error);
}
};
Преобразование JSON-данных
AsyncStorage работает только с текстовыми данными, а значит, если вы хотите хранить сложные объекты, их нужно предварительно сериализовать в JSON.
// Сохранение сложного объекта
const saveObject = async (userData: { name: string; age: number }) => {
try {
const jsonValue = JSON.stringify(userData); // Преобразуем объект в строку
await AsyncStorage.setItem('userData', jsonValue);
console.log('Данные пользователя сохранены!');
} catch (error) {
console.error('Ошибка сохранения данных пользователя:', error);
}
};
// Извлечение сложного объекта
const getObject = async () => {
try {
const jsonValue = await AsyncStorage.getItem('userData');
if (jsonValue !== null) {
const parsedData = JSON.parse(jsonValue); // Преобразуем строку обратно в объект
console.log('Извлеченные данные пользователя:', parsedData);
return parsedData;
}
} catch (error) {
console.error('Ошибка извлечения данных пользователя:', error);
}
};
Типичные ошибки и лучшие практики
Работа с AsyncStorage, как и с любой асинхронной библиотекой, имеет подводные камни:
Пропущенная обработка ошибок. Не забудьте обрабатывать исключения как в
try/catch, так и в блокахcatchпромисов. Это особенно важно при работе с реальными устройствами, где могут быть проблемы с памятью.Ограничение на размер. Не пытайтесь хранить огромные данные. Если вам нужно хранить что-то сложнее, чем пара ключ-значение, подумайте об альтернативах вроде SQLite.
Асинхронность. Не забывайте, что
AsyncStorageвозвращает промисы, и ваш код может работать некорректно, если вы не дожидаетесь завершения операций.
Практическая задача: сохранение и извлечение темы оформления
Попробуйте реализовать функциональность, где пользователь может выбрать тему оформления приложения (например, светлая или темная). Вы должны:
- Сохранять тему в
AsyncStorageпри изменении. - Извлекать тему при запуске приложения и автоматически применять её.
import React, { useEffect, useState } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';
const App = () => {
const [theme, setTheme] = useState<string>('light');
// Сохранение темы
const saveTheme = async (selectedTheme: string) => {
try {
await AsyncStorage.setItem('appTheme', selectedTheme);
setTheme(selectedTheme);
} catch (error) {
console.error('Ошибка сохранения темы:', error);
}
};
// Извлечение темы при загрузке приложения
useEffect(() => {
const fetchTheme = async () => {
try {
const savedTheme = await AsyncStorage.getItem('appTheme');
if (savedTheme) {
setTheme(savedTheme);
}
} catch (error) {
console.error('Ошибка извлечения темы:', error);
}
};
fetchTheme();
}, []);
return (
<div style={{ background: theme === 'dark' ? '#333' : '#FFF', color: theme === 'dark' ? '#FFF' : '#000' }}>
<h1>Тема: {theme}</h1>
<button onClick={() => saveTheme('light')}>Светлая тема</button>
<button onClick={() => saveTheme('dark')}>Темная тема</button>
</div>
);
};
export default App;
Вот так мы шаг за шагом научились использовать AsyncStorage, чтобы сохранять и извлекать данные. Этот функционал поможет создавать более отзывчивые и персонализированные приложения.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ