LocalStorage в Vue: простой Todo с сохранением

О чём статья
- Что такое LocalStorage и зачем его использовать в клиентских приложениях.
- Полное пошаговое создание простого To‑Do на Vue с сохранением в LocalStorage.
- Практические советы, чек‑листы и тест‑кейсы для приёмки.
Зачем использовать LocalStorage
LocalStorage — это встроенный веб‑API браузера для хранения пар «ключ—значение» локально на устройстве пользователя. Он прост в использовании, хорошо подходит для небольших объёмов данных и сохраняет значения между сессиями (даже после закрытия вкладки или браузера).
Коротко: LocalStorage хорош для кэша, настроек, временных списков и простых данных пользователя. Не используйте его для секретов, больших объёмов или данных, требующих совместного доступа между пользователями.
Важно: LocalStorage — синхронный API. При работе с очень большими объёмами данных это может блокировать основной поток и ухудшать отзывчивость интерфейса.
Требования и подготовка
Перед началом убедитесь, что на компьютере установлены Node.js и npm.
Создайте новый проект Vue (Vite + Vue 3 рекомендуются). Команда для создания проекта (выполните в терминале):
npm create vueВ процессе установки выберите пресет без дополнительных опций (можно отвечать “No” на лишние фичи) — нам нужен минимальный проект для простого Todo.
После создания проекта откройте папку проекта в вашем редакторе и приступайте к созданию компонентов.
Структура приложения
Мы реализуем два компонента:
- src/components/Todo.vue — рендерит список задач и генерирует событие удаления.
- App.vue — отвечает за ввод новой задачи, хранение массива задач и интеграцию с LocalStorage.
Файл Todo.vue
Создайте файл src/components/Todo.vue и вставьте туда следующий код. Компонент получает массив задач как пропс и эмитит событие удаления по индексу.
-
{{ todo.text }}
Пояснения к компоненту:
- defineProps([‘todos’]) — получает пропс todos (массив задач).
- defineEmits([‘remove-todo’]) — объявляет событие удаления, которое отправит индекс удаляемой задачи родителю.
- v-for — рендерит каждую задачу; по нажатию на кнопку вызывается removeTodo, который эмитит событие.
Совет: для реальных приложений лучше давать каждой задаче уникальный id вместо использования индекса как ключа.
Файл App.vue — логика и сохранение в LocalStorage
Откройте App.vue и вставьте в секцию
Пояснения:
- todos — реактивный массив задач.
- addTodo проверяет непустую строку, добавляет новую задачу и сохраняет массив в LocalStorage.
- removeTodo удаляет задачу по индексу и снова сохраняет изменения.
- saveToLocalStorage и loadFromLocalStorage обёрнуты в try/catch для безопасной работы в окружениях с отключённым LocalStorage (например, приватный режим некоторых браузеров).
Примечание: для совместимости и тестируемости лучше оборачивать доступ к localStorage в отдельный модуль или сервис.
Файл App.vue — пользовательский интерфейс (template)
Вставьте в template блока App.vue следующий HTML-шаблон. В нём локализованы UI‑ярлыки на русский язык.
Список задач
После этого запустите локальный сервер разработки:
npm run devВы должны увидеть интерфейс с полем ввода и списком задач.
Проверка работоспособности: простые тесты
Добавьте и удалите несколько задач, перезагрузите страницу — задачи должны сохраниться.
Критерии приёмки:
- После добавления задачи она появляется в списке.
- После перезагрузки страницы все ранее добавленные задачи отображаются.
- Удаление задачи удаляет её из списка и LocalStorage.
- Пустая строка не добавляется как задача.
Тестовые сценарии (коротко):
- Добавить задачу “Купить хлеб” → ожидается её появление.
- Нажать Enter вместо клика — задача добавляется.
- Удалить задачу → она исчезает и не возвращается после перезагрузки.
- Отключить доступ к LocalStorage (симуляция ошибки) → приложение не должно падать (ошибки логируются).
Когда LocalStorage не подходит (контрпримеры)
- Если нужно делиться данными между пользователями или устройствами — LocalStorage не синхронизируется между машинами.
- Если требуется хранить секреты, токены аутентификации или персональные данные с юридическими ограничениями — не храните их в LocalStorage.
- Если объём данных большой (несколько мегабайт и более) — LocalStorage может ухудшать производительность и приводить к ошибкам (квоты браузера).
Альтернатива: для сложных сценариев используйте серверную базу данных, IndexedDB (для больших объёмов на клиенте) или специализированные SDK (например, для офлайн‑синхронизации).
Альтернативные подходы и когда их выбирать
- IndexedDB — для больших или структурированных данных на клиенте; асинхронный и более производительный.
- Service Worker + Cache API — для офлайн‑доступа и кеширования ресурсов, не для произвольных структур данных.
- Сохранение на сервере (REST/GraphQL) — если нужны совместный доступ и централизованное хранение.
- Пакеты-обёртки (vuex-persist, pinia-plugin-persist) — если вы используете глобальное состояние и хотите автоматическую синхронизацию с LocalStorage.
Выбор по ситуации:
- Небольшие пользовательские настройки и простые списки → LocalStorage.
- Большой объём данных или сложные запросы на клиенте → IndexedDB.
- Совместный доступ и безопасность → сервер.
Ментальные модели и эвристики
- «LocalStorage = локальный кэш пользователя» — думайте о нём как о временном хранилище для удобства UX.
- «Не доверяй клиенту» — данные в браузере легко изменить; не используйте LocalStorage как источник истины для бизнес‑логики.
- «Разделяй интерфейс и хранение» — абстрагируйте доступ к LocalStorage в сервис, чтобы при миграции на другую стратегию достаточно было заменить реализацию сервиса.
Чек‑лист по внедрению LocalStorage в проект Vue
Для разработчика:
- Выделен сервис/модуль для работы с LocalStorage.
- Обработаны исключения при недоступности LocalStorage.
- Данные сериализуются/десериализуются через JSON.
- Используются уникальные ключи (namespace) для проекта.
- Не хранятся чувствительные данные.
- Имеются тесты на добавление/удаление/загрузку при инициализации.
Для QA:
- Проверка персистентности после перезапуска браузера.
- Тест в приватном режиме (если локально ограничен доступ к localStorage).
- Тесты на поведение при переполнении квоты (симуляция больших данных).
Простая методология миграции от LocalStorage к IndexedDB или серверу
- Создайте абстрактный интерфейс storage.get/set/remove.
- Подключите реализацию LocalStorage к этому интерфейсу.
- Напишите интеграционные тесты для интерфейса.
- Реализуйте IndexedDB/серверную реализацию и переключите конфиг.
- Запустите тесты и проверьте отсутствие регрессий.
Безопасность и конфиденциальность
- Не сохраняйте токены доступа и личные данные в LocalStorage. Токены можно держать в HttpOnly куках для безопасности.
- Убедитесь, что пользователь знает и согласен на хранение данных локально, если этого требует политика приватности.
Советы по улучшению UX
- Показывайте индикатор сохранения (например, ненавязчивый «Сохранено»), особенно если сохранение асинхронное.
- При удалении добавьте подтверждение или возможность отмены (undo).
- Используйте уникальные id для задач, чтобы правильно обрабатывать параллельные операции и ре‑рэндеринг.
Краткий глоссарий (1 строка каждая)
- LocalStorage — браузерное хранилище пар «ключ—значение», сохраняющееся между сессиями.
- IndexedDB — асинхронная браузерная база данных для больших объёмов и сложных структур.
- Сериализация — преобразование структуры данных в строку (например, JSON.stringify).
Резюме
- LocalStorage — быстрый способ добавить персистентность для небольших данных в Vue‑приложении.
- Для простого Todo достаточно двух компонентов (App.vue и Todo.vue), сохранения JSON‑строки по ключу и загрузки при инициализации.
- Для продакшна стоит абстрагировать доступ к хранилищу, обрабатывать ошибки и не хранить секреты.
Важно: всегда думайте о будущем — какая часть данных может вырасти, потребуется ли синхронизация между устройствами и какие правила безопасности применяются к данным.
Ключевые шаги ещё раз:
- Создать компонент списка задач (Todo.vue).
- Реализовать логику добавления/удаления в App.vue.
- Сериализовать массив задач и сохранять в localStorage.
- Загружать данные при старте приложения.
Дополнительные ресурсы: изучите IndexedDB и библиотеки для управления состоянием (Pinia, Vuex) с плагинами для персистентности, если проект растёт.
Спасибо — теперь у вас есть рабочая основа для Todo на Vue с локальным сохранением задач и карта возможных улучшений.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone