Гид по технологиям

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

6 min read Frontend Обновлено 05 Jan 2026
LocalStorage в Vue: простой Todo с сохранением
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.

Процесс создания нового Vue приложения

После создания проекта откройте папку проекта в вашем редакторе и приступайте к созданию компонентов.

Структура приложения

Мы реализуем два компонента:

  • src/components/Todo.vue — рендерит список задач и генерирует событие удаления.
  • App.vue — отвечает за ввод новой задачи, хранение массива задач и интеграцию с LocalStorage.

Файл Todo.vue

Создайте файл src/components/Todo.vue и вставьте туда следующий код. Компонент получает массив задач как пропс и эмитит событие удаления по индексу.





Пояснения к компоненту:

  • 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

Вы должны увидеть интерфейс с полем ввода и списком задач.

Простейшее приложение Todo с полем ввода и списком задач

Проверка работоспособности: простые тесты

Добавьте и удалите несколько задач, перезагрузите страницу — задачи должны сохраниться.

Критерии приёмки:

  • После добавления задачи она появляется в списке.
  • После перезагрузки страницы все ранее добавленные задачи отображаются.
  • Удаление задачи удаляет её из списка и 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 или серверу

  1. Создайте абстрактный интерфейс storage.get/set/remove.
  2. Подключите реализацию LocalStorage к этому интерфейсу.
  3. Напишите интеграционные тесты для интерфейса.
  4. Реализуйте IndexedDB/серверную реализацию и переключите конфиг.
  5. Запустите тесты и проверьте отсутствие регрессий.

Безопасность и конфиденциальность

  • Не сохраняйте токены доступа и личные данные в LocalStorage. Токены можно держать в HttpOnly куках для безопасности.
  • Убедитесь, что пользователь знает и согласен на хранение данных локально, если этого требует политика приватности.

Советы по улучшению UX

  • Показывайте индикатор сохранения (например, ненавязчивый «Сохранено»), особенно если сохранение асинхронное.
  • При удалении добавьте подтверждение или возможность отмены (undo).
  • Используйте уникальные id для задач, чтобы правильно обрабатывать параллельные операции и ре‑рэндеринг.

Краткий глоссарий (1 строка каждая)

  • LocalStorage — браузерное хранилище пар «ключ—значение», сохраняющееся между сессиями.
  • IndexedDB — асинхронная браузерная база данных для больших объёмов и сложных структур.
  • Сериализация — преобразование структуры данных в строку (например, JSON.stringify).

Резюме

  • LocalStorage — быстрый способ добавить персистентность для небольших данных в Vue‑приложении.
  • Для простого Todo достаточно двух компонентов (App.vue и Todo.vue), сохранения JSON‑строки по ключу и загрузки при инициализации.
  • Для продакшна стоит абстрагировать доступ к хранилищу, обрабатывать ошибки и не хранить секреты.

Важно: всегда думайте о будущем — какая часть данных может вырасти, потребуется ли синхронизация между устройствами и какие правила безопасности применяются к данным.

Ключевые шаги ещё раз:

  1. Создать компонент списка задач (Todo.vue).
  2. Реализовать логику добавления/удаления в App.vue.
  3. Сериализовать массив задач и сохранять в localStorage.
  4. Загружать данные при старте приложения.

Дополнительные ресурсы: изучите IndexedDB и библиотеки для управления состоянием (Pinia, Vuex) с плагинами для персистентности, если проект растёт.

Спасибо — теперь у вас есть рабочая основа для Todo на Vue с локальным сохранением задач и карта возможных улучшений.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство