Фреймфорк Vue.js
Вы создадите мини-платформу для ведения блога, используя Vue 3 Composition API и TypeScript.
Образовательные результаты
- Использование TypeScript в компонентах, props, событиях и моделях данных.
- Понимание и применение реактивность с помощью ref и reactive для управления состоянием.
- Использование вычисляемых свойств для производного состояния.
- Передача данных между компонентами с помощью props и событий.
- Структурирование приложения с помощью компонентов, используя Composition API в
<script setup>
. - Выполнение асинхронных операций с json-server для получения, создания, обновления и удаления записей в блоге.
- Использование оптимистичных обновлений пользовательского интерфейса для повышения воспринимаемой производительности, когда изменения пользовательского интерфейса происходят непосредственно перед подтверждением сервера, с откатом при ошибках.
- Применение localStorage для автосохранения и восстановления данных.
Порядок выполнения лабораторной работы
Подготовка
- Создать ветку
blog
и переключиться в нее и ее же надо будет отправлять в репозиторий. - Создайте новый проект Vue + TypeScript. Инструкция в документации фреймворка.
- Установите в проект json-server. Лучше локально.
- Создайте db.json в корне проекта с исходными данными как в примере ниже.
- Запустите json-server для имитации REST API на локальном порту.
Пример структуры объекта поста:
{
id: number,
title: string,
content: string,
author: {
id: number,
name: string,
},
createdAt: string,
published: boolean,
}
Функциональность
У приложения одна роль - пользователь. Он может:
- просматривать все записи и видеть общее количество записей.
- искать записи по содержимому заголовков.
- добавить новую запись.
- удалить существующую запись.
- редактировать существующую запись.
- восстановить черновик записи при перезагрузке страницы.
- сбросить черновик.
Язык интерфейса русский.
Реакции UI
- Валидируются поля формы на стороне клиента при добавлении и редактировании записей и пользователю показываются сообщения об ошибках при потери фокуса и при отправке формы.
- Отключена отправка формы во время выполнения запроса.
- Отображаются состояния отправки формы (загрузка, успешное выполнение, ошибка).
- Обрабатывается ситуация, когда нет записей или когда фильтры не соответствуют ни одной записи.
- Отображаются состояния загрузки данных - спиннеры.
- Интерфейс поддерживает оптимистичное обновление. То есть действие отображается сразу, если происходит ошибка, то происходит возвращение к предыдущему состоянию.
Проблемы с сетью эмулируйте через инструменты разработчика в браузере, выставляя низкую скорость или оффлайн режим. Также можно останавливать процесс json-server.
Автоматическое сохранение и восстановление
- Автоматическое сохранение состояния формы в localStorage с использованием debounced watch (например, 500 мс).
- При монтировании компонента формы проверьте наличие черновика; если он обнаружен, запросите восстановление.
- Очистите черновик при успешной отправке или когда пользователь удалит его.
Возможная структура компонентов
Разделите UI как минимум на эти компоненты:
- App.vue: корневой компонент, который управляет общим состоянием и приложением.
- PostList.vue: Отображает список записей, используя вычисленные свойства для фильтрации или сортировки.
- PostItem.vue: Дочерний компонент для отдельных записей, получающий данные записи через props и выполняющий действия редактирования/удаления.
- NewPostForm.vue: Компонент формы для создания новых сообщений, отправляющий события родительскому элементу.
- PostFilters.vue: Поисковый ввод.
Используйте defineProps для пропсов и defineEmits для пользовательских событий в дочерних компонентах.
Завершение работы
- Зафиксировать результаты работы с помощью системы контроля версий git в репозиторий на github.
- Отправить коммиты на ваш репозиторий в Classroom.
- Отправить работу на хостинг.
Требования
- Пользовательский интерфейс работает мгновенно и с оптимистичными обновлениями.
- Есть надежная обработка загрузки, ошибок и пустых состояний.
- Все компоненты используют
<script setup>
, Composition API. - Правильное использованы вычисленные свойства и реактивность.
- TypeScript не содержит ошибок.
- Минимальный набор стилей CSS для удобства чтения.
- Код проекта в репозитория на GitHub с README, объясняющим, как его запустить, включая запуск json-server.
- Доступность
- Используйте aria-invalid и aria-describedby.
- Убедитесь, что кнопки имеют различимый текст и отключены корректно.
Результат выполнения
Страница с работающим нано-блоггингом на хостинге и исходным кодом в репозитории на Classroom.