Vue 3
Документация
Установка Vue
npm install -g @vue/cli // устанавливаем vue cli глобально
vue create my-project // создаём проект
npm run serve // запускаем проект
Корневые директории, с которыми будем работать
- public
- src
В public лежит файл index.html, в нём div с id="root".
Сюда будет монтироваться приложение
В src файл main.js в который импортируется компонент App.vue и передаётся (монтируется) в index.html
Компоненты
Каждый компонент это объект с набором полей.
В поле data приходят данные, которые будет использовать компонент, в поле methods пишем функции.
Чтобы создать компонент, создаём файл с его названием и расширением .vue.
Для названия созданных нами компонентов обязательно использовать СamelCase, этим они отличаются, от компонентов, созданных самим фреймворком, например, компонента App
Затем заходим в файл компонента, пишем vbase, затем нажимаем Tab и перед нами базовая структура компонента - template, script, style.
Sass
Компонент style, который создаётся командой vbase содержит параметры lang="scss" и scoped
Последний означает, что стили будут применяться только к данному конкретному компоненту
С lang="scss" приложение возвращает ошибку: "Can't resolve 'sass-loader'"
Чтобы разрешить использование scss стилей во vue, устанавливаем два пакета sass-loader и node-sass:
npm install sass-loader -D
npm install node-sass -D
Или в процессе установки vue нужно было разрешить использовать css-препроцессор
Счётчик лайков
{{ likes }} - это интерполяция с её помощью данные из data передаём в template
Но если данные нужно добавить в адрес картинки, тогда пишем так
<img v-bind:src=post.image />
или короткая запись:
v-on:click="addLike" - так во Vue записываем addEventListener "click"
@click="addDislike" - это короткая запись аналогичная предыдущей
this.likes - если в методе используем данные из data, пишем не data.likes, а this.likes
Список постов
В data помещаем данные постов, а в template выводим их на страницу
Запись v-for="post in posts" в родительском элементе позволяет итерироваться по массиву постов
Создание поста
Создаём форму с двумя инпутами и кнопкой отправить
@submit.prevent - отключаем для формы событие по умолчанию (отправка формы с перезагрузкой страницы)
v-bind:value="title"- привязываем данный инпут к полю title объекта data данного модуля
@input="title = $event.target.value" - указываем, что title равно тексту, который в данный инпут вводится
@click="createPost" - при клике по кнопке выполняем функцию createPost
Саму функцию createPost записываем в объекте methods
Разбиваем код на модули
в папке src/components создаём файлы PostList.vue и PostForm.vue
Переносим в них разметку и стили
Переходим в файл App.vue и в поле script импортируем и регистрируем модули
Затем их можно добавить в разметку
Форма отобразилась, а список постов нет, так как он не получил данные data, которые остались в App.vue
Пропсы
Список постов передаём в виде пропса в файл PostList.vue
В файле App.vue передаём пропс
или короткая запись (по аналогии как v-on:click можно заменить @click)
Ещё один важный момент.
Пропсы в дочернем компоненте изменять нельзя!
Данные могут изменяться в родителе, а дочерний компонент должен получать их в готовом виде.
Передача данных от ребёнка родителю
Пропсы позволяют передать данные от родителя - компонента App.vue к ребёнку - компоненту PostList.vue.
Благодаря пропсам список постов у нас отобразился.
Но возможности добавлять новые посты нет, так как она была заложена в форме, которую мы вынесли в отдельный компонент.
Нужно научиться передавать данные от дочернего компонента PostForm.vue к родителю App.vue.
В компонент PostForm.vue добавляем объект data:
в инпутах меняем привязку и направление передачи данных с title и body на post.title и post.body, т.е передаём данные в созданный объект data:
Директива this.$emit("create", this.posts); - эмитер события. она генерирует событие, которое передаётся родителю. Первый аргумент - название события, его мы придумываем сами, второй аргумент - что передаём от дочернего элемента в родительский, в нашем случае post.
Переходим в родительский элемент App.vue, чтобы на это событие подписаться
Запись @create="createPost" - это подписка на событие
Здесь @create - название события, на которое мы подписались (то. которое придумали и указали в эмитере), "createPost" - какая функция будет вызываться, когда это событие произойдёт.
Функцию прописываем в методе App.vue
Функция принимает один аргумент post - тот, который передал ей эмитер, и добавляет этот пост в массив постов.
Выносим пост в отдельный компонент
Хорошие компоненты - независимые компоненты
Чем меньше будут связаны между собой наши компоненты, тем более масштабируемым получится приложение
Сейчас форма принимает данные про пост и передаёт их, список постов принимает данные и отрисовывает посты. Создадим отдельный компонент для отдельного поста.
в папке components создаём компонент PostItem.vue, переносим в него разметку и стили из PostList.vue, а также добавляем пропс
В компоненте PostList.vue импортируем и регистрируем компонент PostItem.vue и добавляем его в разметку:
https://youtu.be/XzLuMtDelGk?t=2948 - удаление поста из списка
https://youtu.be/XzLuMtDelGk?t=3012 - UI компоненты
https://youtu.be/XzLuMtDelGk?t=4048 - условная отрисовка
Для условной отрисовки есть две директивы
v-if="posts.length > 0"... v-else
v-show="length > 0", v-show="length < 0"
Первая полностью удаляет блок свойством display: none
Вторая отображает или скрывает его свойством visibility: visible/hidden
https://youtu.be/XzLuMtDelGk?t=4220 - модальное окно
https://youtu.be/XzLuMtDelGk?t=4560 = модификаторы v-model
v-model.trim - удаляет пробелы в начале и в конце
v-model.number - от инпута получаем число, а не строку
v-model.lazy - позволяет отслеживать событие on-change вместо input