Наименование Проектирование динамических страниц с помощью фрэймворка Vue.js
Автор А.В.Михалькевич
Специальность Разработка фронтенд приложения с помощью Vue.,
Анотация
Публикация посвящена разработке фронтенд приложения на Vue.js с помощью Vue CLI. Требуется предворительное знание HTML, CSS, основ JavaScript и умение устанавливать плагины и запускать приложения с помощью node.js
Anotation in English
The publication is dedicated to the development of the frontend application on Vue.js using Vue CLI.
Ключевые слова vue, vue cli, vue.js, node.js, JavaScript, frontend, фронтенд
Количество символов 61136
Сперва необходимо установить node.js
Информация по установке - https://nodejs.org/en/download
В Ubuntu node.js можно установить с помощью репозитория apt
:
Убедтиться в том, что node установлен, можно с помощью этой команды
node -v
Так же давайте проверим менеджер пакетов для node - npm
npm -v
Npm устанавливается следующим образом:
sudo apt install npm
Подробнее по node - по ссылке http://erud.by
Установим Vue CLI в качестве глобального модуля
npm install -g @vue/cli # OR yarn global add @vue/cli
Команды должны быть запущены от имени администратора, т.е. под sudo
.
Убедиться в том, что vue установлен:
vue -v
С информацией по Vue CLI можно ознакомиться на официальном сайте - https://cli.vuejs.org
Создать vue-проект можем одним из двух способов: с помощью консоли и с помощью user interface.
Сперва перейдём в нужную папку на сервере.
Пусть это будет /var/www/vue
(или любая другая папка, где будет развёрнуто vue-приложение).
Находясь в нужной папке выполняем команду:
vue create vue_admin
Далее необходимо ответить на вопросы.
Для того, чтобы открыть user interface, тоже необходима консоль.
Находясь в нужной папке запустим следующую команду:
vue ui
Такой ответ консоли
свиделельствует о том, что user inteface доступен по адресу http://localhost:8000.
Начинаем создание проекта с указания имени папки, указания пакетного менеджера и предворительных настроек.
Далее выбираем Default preset (тогда проект будет содержать дефолтный набор модулей).
Создание проекта может занять некоторое время:
После чего на экране поверх открытых окон появится сообщение, что проект vue создан:
В браузере откроется dashbord или рабочий стол проекта
Запуск и управление конфигцрациями проекта осуществляется по вкладке Задачи.
Запускаем задачу, и проект становится доступным по порту 8080 (либо другим, если он занят). Т.е. в браузере проект будет доступен по ссылке http://localhost:8080.
Вернуться к менеджеру проекта можно с помощью раскрывающегося списка в верхнем левом углу экрана или кнопки домой в строке состояния внизу.
Исходники разрабатываемого проекта доступны по ссылке - https://github.com/mikhalkevich/vue_admin
Так же как и при создании, запустить проект мы можем двумя способами. Либо с помощью консоли, либо через user interface.
После того, как проект создан, необходимо его запустить.
Для этого переходим в папку с проектом
cd vue-admin
и запускаем проект
npm run serve
Такой ответ косоли свидетельствует о том, что проект запущен
Соотвтетственно, теперь мы можем открыть браузер, и в адресной строке набрать localhost:8081
Должны увидеть такую страницу:
Для запуска проекта с помощью user interface сперва перейдём во вкладку "Tasks". Далее нажимаем кнопку "Serve" и "Start tasks". Такой ответ браузера свидетельствует о том, что проект запущен.
Открыть созданный проект можно с помощью кнопки "Open app" или набрав в браузере http://localhost:8081. Каждый последующий проект будет занимать следующий по очереди порт: 8081, 8082 и т.д. Так же имеется возможность разместить проект на любом другом доступном порте.
Этапы разработка фронтенда с помощью фрэймворка Vue
На фронтенд возлагаются задачи:
Vue по умолчанию отлично справляется с первой задачей. А для всех остальных необходимо подобрать и установить модули.
Начальный набор модулей проекта: "axios", "core-js", "vue", "vue-router", "vuex"
Каждый из них можно установить либо через интерфейс, либо с помощью консоли следующей командой:
npm i vue, axios, vue-router, vuex
А теперь еще раз взглянем на задачи, и сопоставим их с модулями.
При шаблонизации проекта выделяют:
базовый App.vue
маршрутные компоненты
вспомогательные
После установки необходимых модулей, открываем файл store/index.js
вставляем следующий код:
Исходный код
import { createStore } from 'vuex' export default createStore({ state: {}, getters: {}, actions: {}, mutations: {} })
Добавляем axios
import { createStore } from 'vuex' import axios from "axios" export default createStore({ state: {}, getters: {}, actions: {}, mutations: {} })
В дальнейшем, в этом файле будут храниться объекты с данными. Пример store/index.js
с запросом на бэкенд:
import { createStore } from "vuex"; import axios from "axios"; export default createStore({ state: { users: [], catalogs: [] }, getters: { getUsers: (state) => state.users, getCatalogs: (state) => state.catalogs, }, actions: { async fetchUsers({ commit }) { try { const data = await axios.get( "https://jsonplaceholder.typicode.com/users" ); commit("SET_USERS", data.data); } catch (error) { alert(error); console.log(error); } }, async fetchCatalogs({ commit }){ try { const data = await axios.get( "public/catalogs" ); commit("SET_CATALOGS", data.data); } catch (error) { alert(error); console.log(error); } } }, mutations: { SET_USERS(state, users) { state.users = users; }, SET_CATALOGS(state, catalogs) { state.catalogs = catalogs; }, }, });
При разработке данного проекта используется шаблон проектирования MV-VM, где
MV (model и view) - компонент приложения.
Подробнее - дисциплина ООП
За настройку маршрутов отвечает плагин vue-router
.
npm i vue-router
Добавить его так же как и любой другой модуль npm можно и через рабочий стол менеджера проектов Vue. Для этого необходимо перейти по ссылке "Плагины" http://localhost:8000/plugins и нажать кнопку "Добавить vue-router"
Сразу после установки плагина,в проекте поменяется струтктура, добавятся дирректории router
и views
:
Обратите внимание на то, что в папках views и components - похожие компоненты. Но у них разное предназначение. В папке views хранятся маршрутные компоненты, в папке components - вспомогательные.
Сразу после установки модуля станут доступны две страницы приложения: гавная "/" и about "/about"
Так выглядит дефолтная настройка маршрутизатора:
import { createRouter, createWebHashHistory } from 'vue-router' import HomeView from '../views/HomeView.vue' const routes = [ { path: '/', name: 'home', component: HomeView }, { path: '/about', name: 'about', // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue') } ] const router = createRouter({ history: createWebHashHistory(), routes }) export default router
Давайте еще раз взглянем на маршрутизатор по-умолчанию:
import Home from "../views/Home.vue"; const routes: Array = [ { path: "/", name: "Home", component: Home, } ];
Обратите внимание на то, что подгружаемый компонент маршута выводится в тэг router-view
базового компонента App.vue:
Для создания ссылок на такой подгружаемый маршрутный компонент есть тэг router-link
Переменные в маршрутах определяются символом :
. Пример:
{path:'/destination/:id', component: ()=>import('@/vews/DestinationShow.vue')}
В компоненте DestinationShow к значению переменной id мы можем обратиться с помощью объекта $route.params
:
Часто, после того, как мы получили переменную из адресной строки, её необходимо преобразовать. В данном случае, перевести в числовой тип.
Например, создать переменную destinationId
и использовать её в функции для создания объекта destination
мы можем следующим образом:
import sourceData from '@/data.json' export default { computed:{ destinationId(){ return parseInt(this.$route.params.id); }, destination(){ sourceData.destinations.find(destination => destination.id === this.destinationId) } } }
Использование объект destination
в шаблоне:
Если создать именной маршрут
{path:'/destination/:id', name:'destination.show' component: ()=>import('@/vews/DestinationShow.vue')}
То в любом шаблоне в router-link
можно сослаться на него с помощью свойства name
параметра :to
Маршрутизатор по умолчанию добавляет # во все запросы (пример: http://localhost:8081/#/about). Чтобы от него избавиться необходимо ввести небольшие изменения в файл router/index.js
. Вместо модуля createWebHashHistory
подключить и использовать модуль createWebHistory:
import { createRouter, createWebHistory } from 'vue-router'; ... const router = createRouter({ history: createWebHistory(), routes })
Если в маршрутизаторе определяются переменные, например:
{ path: '/', name: 'index', components: { default: Index, header: MainNavbar, footer: MainFooter }, props: { header: { colorOnScroll: 400 }, footer: { backgroundColor: 'black' } } }
то в app.js их можно использовать так:
<template> <div id="app"> <router-view name="header" /> <div class="wrapper"> <router-view /> </div> <router-view name="footer" /> </div> </template> <script> export default {}; </script>
Vue позволяет нам создавать интерфейсные веб-приложения с компонентами. С ними мы можем разделить наше приложение на маленькие, повторно используемые части, которые составляются вместе, чтобы сделать большое приложение. Этот композиция выполняется путем вложения. Чтобы разные части приложения составлялись вместе, мы может передавать данные между ними. Компоненты можно брать из библиотек, а также можем создавать сами.
Компоненты - это файлы с расширением vue, которые обычно хранятся в папке /src/components
. Компоненты могут принимать значения из родительских компонетов и могут быть использованы для передачи данных в дочерние компоненты.
После установки router-view появляется такой тип компонента, как - маршрутный. Маршрутный компонент - это компонент ленивой подгрузки в тэг router-view. Вспомогательный компонент - все остальные компоненты шаблона.
Компонент состоит из:
- тэга template
, внутри которого содержится html-код и vue-тэги других компонентов.
- скрипты, содержащиеся в тэге script
- стили в тэге style
Первоначальной задачей после установки фронтенда, необходимио разбитие шаблона на компоненты. Но, сперва визуально разделим страницу шаблона на две части - меняющуюся часть и неизменную. Часто, к неизменной относится меню, шапка и подвал сайта. Так же, часто элементы меню лучше переносить в отдельный вспомогательный компонент Menu.vue
На низком уровне Компоненты представляют собой изолированные части (блоки) пользовательского интерфейса (UI). Компонент может взаимодействовать с другими компонентами.
Возьмем, к примеру, элемент
. Мы можем использовать этот элемент с любыми технологиями в браузере, и мы можем передавать такие свойства, как width и height и слушайте такие события, как onclick.
На высоком уровне, мы можем сказать, что компоненты — это набор API-интерфейсов веб-платформы. (интерфейсы прикладного программирования), которые позволяют нам создавать теги HTML, со встроенными стилями и JavaScript логикой, которые будут работать в современных веб-браузерах и может использоваться фрэймворками JavaScript (React, Angular, Vue.js и т. д.).
Ожидается, что компоненты будут использоваться в веб-браузерах в течение длительного времени и предлагают множество преимущества, в том числе следующие:
• Веб-компоненты можно использовать повторно и работать между платформами.
• Веб-компоненты могут работать во всех основных веб-браузерах.
• Веб-компоненты просты в обслуживании и готовы к будущем, если они основаны на спецификациях веб-платформы.
Для вывода переменной в тэге template можно воспользоваться диррективой {{}}.
Вывод переменной строки или числа:
{{user_name}}
Вывод переменной объекта
{{user.name}}
Вывод массива
<div v-for="user in users" :key="user.id"> Hello, {{ user.name }}, from {{ user.location.city }}! <hr/> </div>
Обратите внимание, что если нужно добавить значение переменной в атрибут к какому-нибудь тэгу, для этого можно воспользоваться диррективой :
.
:key="user.id"
Переменные для компонентов можем создавать в тэге script,
Для создания переменных мы можем использовать метод data
:
export default { data() { return { name: "test", } } }
Тогда в template мы можем вывести значение:
Hello, {{ name }}!
Vue3
Во Vue3 для создания переменных можно воспользоваться модулем ref
. Пример:
import {ref, onMounted} from "vue"; import axios from 'axios'; export default { name: 'About', setup() { const users = ref([]); onMounted(async () => { const response = await axios.get('https://randomuser.me/api/?results=6'); users.value = response.data.results; console.log(users.value); }); return { users } } }
Обратите внимание на то, что после объявления переменной users, мы можем к ней обращаться с помощью users.value
, например для того чтобы определить или переопределить её значение.
Такой способ создания и работы с переменными (с помощью модуля ref и в диррективе setup используется в Composition API)
Входные параметры — это пользовательские атрибуты, которые вы можете установить на компоненте. Когда значение передаётся в атрибут входного параметра, оно становится свойством экземпляра компонента. Чтобы передать заголовок в компонент нашей записи блога, мы можем включить его в список входных параметров, которые принимает компонент, с помощью опции props
:
props: { msg: String }
Тогда при вызове этого компонента, в него можно передать значение переменной msg
msg="значение переменной"
Каждый компонент проходит определенные шаги инициализации. Между этими шагами можно вызывать функции - хуки жизненного цикла. С помощью которых можно выполнять свой код на определенных этапах.
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
beforeDestroy
destroyed
и другие. Подробнее по ссылке https://v3.ru.vuejs.org/ru/api/options-lifecycle-hooks.html#beforecreate
Все хуки вызываются в контексте переменной this.
Пример:
data(){ return { a:2 } }, created() { console.log(this.a) }
У Vue.js для возможности наследования имеются mixin-ы. В mixin мы можем вынести данные, группу методов и даже hook-и жизненного цикла.
Объект примеси сперва необходимо объявить.
Пример:
const myMixin = { created() { this.hello() }, methods: { hello() { console.log('привет из примеси!') } } }
Теперь можем импортировать примесь в компонент.
const app = Vue.createApp({ mixins: [myMixin] })
Однако, возможность переиспользования примесей ограничена: примесям нет возможности передавать какие-либо параметры для управления логикой её работы, что снижает гибкость с точки зрения абстрагированной логики.
В современных версиях Vue.js в качестве альтернативе примесям предлагается иной способ организации кода: Composition API.
С целью получения данных фронтенд может осуществлять запросы на бэкенд.
Существует два основных формата получния данных с бэкенда:
XML — используется в SOAP (всегда) и REST-запросах (реже);
JSON — используется в REST-запросах, т.е. подходит для API.
JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript. Но при этом формат независим от JS и может использоваться в любом языке программирования.
Данные в формате JSON могут быть в файле с расширением .json, или генерироваться динамически серврерным языком программирования (PHP, Node, Python...)
Рассмотрим три примера: 1) переменная с данными в формате JSON, 2) чтение данных JSON из файла и 3) получение данных JSON по ссылке, герерируемой бэкендом.
в
export default { name: 'Time', data() { let pictures = [ {id: 1, image: "pink.jpg", title: "Pink"}, {id: 2, image: "blue.jpg", title: "Blue"}, ]; return { pictures } } }
В тэге template вывод массива picture можно осуществить с помощью атрибута v-for
С примером JSON-файла можно ознакомиться перейдя по ссылке erud.by/uploads/vue_admin/61f14278c509f_data.json
Файл data.json
, который находится в корне папки src
можно импортировать следующим образом:
import sourceData from '@/data.json' export default { data(){ return { destinations: sourceData.destinations } } }
Таким образом мы получили переменную destinations
, которая будет доступна в шаблоне. Для того, чтобы пройтись по всем значениям, хранящимся в JSON, необходимо использовать v-for
:
Обратите внимание на атрибуты :key
, :to
, :src
и :alt
. Это динамические атрибуты-переменные, на что указывает символ :
. Значенине атрибута :key должно быть уникальным.
Данные генерируемые сервером, могут быть динамическими, т.е. зависеть от параметров. Пример - https://randomuser.me/api/?results=2 или https://randomuser.me/api/?results=100. Или статическими, т.е. всегда отдавать одни и те же данные. Могут принимать параметры, по которыми осуществляется запрос на бэкенде, могут не принимать ни одного параметра.
Фронтенд фрэймворкам всё-равно, существует ли файл физически, или он генерируется в момент обращения к нему клиента. Главное, чтобы в формат JSON не было ошибок, иначе фрэймворк откажется его принимать.
При обработке данных, получаемых по ссылке есть несколько особенностей: необходимо выполнить запрос на бэкенд, а для выполнения запроса лучше использовать асинхронную функцию. Для выполнения запросов есть инструмент axios
.
npm install axios
https://github.com/axios/axios - По этой ссылке официальная документация
В скрипте компонента запрос идёт в Vuex store:
import {computed, onMounted} from "vue"; import { useStore } from "vuex"; const store = useStore(); const catalogs = computed(() => { return store.state.catalogs.data; }); onMounted(() => { store.dispatch("fetchCatalogs"); });
В файле store/index.js реализуем метод fetchUsers, который непосредственно и делает сам запрос на бэкенд:
actions: { async fetchUsers({ commit }) { try { const data = await axios.get( "https://jsonplaceholder.typicode.com/users" ); commit("SET_USERS", data.data); } catch (error) { alert(error); console.log(error); } }, }
В Composition API логику получения и обработку ответов сервера приняно выносить в отдельные функции внутри опции setup
, которая выполняется перед созданием компонента, сразу после разрешения входных параметров props, и служит точкой старта для Composition API. Для получения ответов бэкенда необходимы либо колбэки, либо промисы, либо асинхронные функции. Пример асинхронной функции:
import axios from "axios"; import {ref} from "vue"; import {useRouter} from "vue-router"; export default { name: "AuthRegister", setup(){ const user_name = ref(''); const email = ref(''); const password = ref(''); const password_confirmation = ref(''); const router = useRouter(); const submit = async () => { //console.log(user_name, email) const response = await axios.post('register',{ name: user_name.value, email: email.value, password: password.value, password_confirmation:password_confirmation.value }); } return { user_name, email, password, password_confirmation, submit } } }
Обратите внимание, что вызовается axios.post
асинхронно, с помощью await
.
Здесь рассмотрим пример работы с сервером RapidAPI. Но прежде там необходимо зарегистрироваться.
Ссылка на API - https://rapidapi.com/koukoulina001/api/astronomy-picture-of-the-day/pricing
На данный API нужно подписаться по ссылке, после чего станут доступным запросы на сервер astronomy-picture-of-the-day
Пример запроса для Vue
import {ref, onBeforeMount} from "vue"; import axios from "axios"; const picture = ref({'data':{'url':''}}); onBeforeMount(async () => { picture.value = await pictures(); }); const pictures = async () => { const options = { method: 'GET', url: 'https://astronomy-picture-of-the-day.p.rapidapi.com/apod', params: {api_key: 'nWYhQQdmCKwd0cVvrfyge124OrW4fnVOEL7QDdJH'}, headers: { 'X-RapidAPI-Key': '3ea575d164msh0d4f30e1df818b9p1b9782jsn2515200d115d', 'X-RapidAPI-Host': 'astronomy-picture-of-the-day.p.rapidapi.com' } }; let stoba = await axios.request(options) return stoba; };
В процессе разработки фронтенда, нужны фэйковые данные.
Для получения фэйковых данных можно перейти по ссылке https://jsonplaceholder.typicode.com/ и выбрать необходимый ресурс: posts, users, photos ...
Если нужно больше тестовых пользователей, то можно воспользоваться ресурсом https://randomuser.me/api/?results=100 (вместо цифры 100 можно вводить любую цифру - количество выдаваемых пользователей)
Если на стороне бэкенда авторизация реализуется с помощью Laravel Sanctum, то для авторизации на стороне фронтенда, на бэкенд необходимо отправлять вместе с запросами параметр barear со значением token-а, который должен вернуть бэкенд после прохождения запросов login или register.
Для создания глобальных дефолтных настроек запросов можем в файле main.js импортировать модуль axios и через него добавить необходимые значения:
import { createApp } from 'vue' import App from './App.vue' import router from './router' import axios from 'axios'; axios.defaults.baseURL = 'http://localhost:8000/api/'; axios.defaults.headers["content-type"] = "application/json"; axios.defaults.headers.common.authorization = `Bearer ${localStorage.getItem('token')}`; axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'; createApp(App).use(router).mount('#app');
Сперва необхоимо создать маршрут
{ path: '/register', name: 'register', component: () => import(/* webpackChunkName: "login" */ '../views/AuthRegister.vue') }
Ссылка на готовый компонент bootstrap формы регистрации - https://github.com/mikhalkevich/vue_admin/blob/main/src/views/AuthRegister.vue
в
Сперва в файле routes/index.js необходимо создать маршрут на компонент с формой логина.
{ path: '/login', name: 'login', component: () => import(/* webpackChunkName: "login" */ '../views/AuthLogin.vue') },
Если в базовом шаблоне у нас подключена библиотека Bootstrap, то форма логина можем взять из шаблонов bootstrap-а.
Компонент логина с формой представленной на изображении можно взять по ссылке - https://github.com/mikhalkevich/vue_admin/blob/main/src/views/AuthLogin.vue
Обрабатывает форму следующий скрипт:
import axios from "axios"; export default { name: 'AuthLogin', data() { return { email: '', password: '' } }, methods: { async sendLogin() { const {data} = await axios.post(`login`, { 'email': this.email, 'password': this.password }); await localStorage.setItem('token', data.token); //document.location.href = '/'; await this.$router.push('/'); }, } }
Необходимые пояснения по скрипту. Заранее объявляем переменные email
и password
. По нажатию на кнопку login
, запускаем асинхронную функцию sendLogin
, которая делает асинхронный запрос на бэк и передает туда значение этих переменных. Далее бэкенд должен вернуть токен, который мы помещаем в localstorage<.code>. Таким образом мы запомнили значение токена, который в глобальных настройках
axios
добавляется к заголовку в bearer
.
Теперь пользователь авторизован и для него будут доступны закрытые запросы бэкенда.
Vuetify — это проект MIT с открытым исходным кодом для создания пользовательских интерфейсов для веб-приложений и мобильных приложений. Это проект, который поддерживается спонсорами и волонтерами из сообщества Vue.
Большинство библиотек с открытым исходным кодом не получают такого уровня внимания. Таким образом, вы можете быть уверены, что когда вы начнете использовать Vuetify в своих проектах, вы не останетесь без поддержки в будущем. Vuetify поддерживает все основные браузеры из коробки. Старые браузеры, такие как IE11 и Safari 9, тоже могут работать, но для этого потребуется babel-polyfill
. Все, что старше этого, не поддерживается. Vuetify построен, чтобы быть семантическим.
Vuetify также поставляется с бесплатными / премиум-темами и готовыми макетами, которые вы можете использовать для быстрого создания темы вашего приложения.
Устанавливаем с помощью NPM:
npm install @vue/cli -g
В файле main.js подключаем модуль:
import Vue from 'vue' import Vuetify from 'vuetify' Vue.use(Vuetify)
Помним про файл стилей, который тоже нужно подключить:
// index.js or main.js import 'vuetify/dist/vuetify.min.css' // Ensure you are using css-loader import 'material-design-icons-iconfont/dist/material-design-icons.css' // Ensure you are using css-loader
Любое приложение должно строиться примерно по такой структуре:
<v-app> <v-navigation-drawer app></v-navigation-drawer> <v-toolbar app></v-toolbar> <v-content> <v-container fluid> <router-view></router-view> </v-container> </v-content> <v-footer app></v-footer> </v-app>
Сразу после добавления Vuetify в проект вы заметите немало изменений в структуре и коде нашего проекта.
Сейчас, если перезапустим сервер и перейдём по http://localhost:8080 , увидим следующее:
Обратите внимание, как теперь страница выглядит иначе, чем начальная страница по умолчанию, которая обычно создается с помощью команды create app
Vue CLI create app
. Это означает, что Vuetify был настроен правильно. Давайте разберем код Vuetify, начиная с этого компонента:
<v-app> <!-- put content here.... --> </v-app>
Компонент v-app
является обязательной оболочкой, необходимой для правильной работы приложения. Он используется для определения точек останова сетки для макета. Он может существовать где угодно внутри <body>
, но должен быть родителем всех компонентов Vuetify. Компонент v-content
должен быть прямым потомком v-app
.
Следующий компонент, который мы обсудим, это v-toolbar
. Это может быть использовано в качестве основной панели инструментов для вашего приложения. Вы можете разместить иконки, меню и другие предметы внутри него.
<v-app> <v-toolbar app> <!-- put content here.... --> </v-toolbar> </v-app>
Первая опора, с которой вы столкнетесь, это app
. Это просто говорит панели инструментов придерживаться вершины, когда пользователь начинает прокручивать вниз. Если вы удалите реквизит app
, панель инструментов будет прокручиваться вместе с остальной частью страницы. Попробуйте сами и посмотрите, что получится. Мы также можем добавить больше реквизита, чтобы настроить внешний вид нашей панели инструментов.
С Vuetify вы поймете, что вам вряд ли понадобится писать какой-либо код CSS для настройки внешнего вида вашего приложения. Однако если вы хотите, чтобы ваше приложение поддерживало несколько тем, вам может потребоваться определить несколько таблиц стилей. Vuetify предоставляет генератор тем, чтобы помочь вам выбрать набор цветов для вашей темы.
А сейчас давайте сосредоточимся на настройке нашего приложения с помощью реквизита. Первый, который мы собираемся изучить, называется dark
. Просто обновите ваш код следующим образом:
<v-app> <v-toolbar app dark> <!-- put content here.... --> </v-toolbar> </v-app>
или
<v-app> <v-toolbar app dark color="red"> <!-- put content here.... --> </v-toolbar> </v-app>
Чтобы затемнить фон, вы можете использовать значения от darken-1
до darken-4
. Каждый уровень увеличивает темноту. Вы можете использовать значения от lighten-1
до lighten-4
чтобы осветлить фон. Если вы хотите изменить цвет текста, добавьте text--
перед text--
— например, text--lighten-3
. У нас также есть accent-1
до accent-4
который, кажется, контролирует насыщенность. accent-1
снижает насыщенность цвета, в то время как accent-4
увеличивает насыщенность и становится более яркой.
Обратите внимание, что я не вытаскиваю эти реквизиты и ценности из воздуха. Вот документация для цветов Vuetify.
Vuetify использует 12-ти точечную систему координат для размещения контента приложения. Он построен с использованием модуля макета CSS Flexbox , который представляет собой систему для распределения элементов в адаптивной структуре макета без использования поплавков или позиций. Сетка поддерживает 5 медиа-точек останова, ориентированных на определенные размеры экрана или ориентации.
Подробнее о системе - vuetifyjs.com/en/components/grids
Рассмотрим некоторые типовые задачи с использованием готовых компонентов Vuetify.
В последующих примерах используются следующие компоненты:
Взгляните на документацию каждого компонента, чтобы узнать, что еще вы можете о них настроить.
Для того чтобы создать форму входа, сперва необходимо создать компонетн components/Login.vue
со следующим кодом:
<template>
<v-layout align-center justify-center>
<v-flex xs12 sm8 md4>
<v-card class="elevation-12">
<v-toolbar dark color="purple">
<v-toolbar-title>Login Form</v-toolbar-title>
</v-toolbar>
<v-card-text>
<v-form>
<v-text-field prepend-icon="person" name="login" label="Login" id="login" type="text" ></v-text-field>
<v-text-field prepend-icon="lock" name="password" label="Password" id="password" type="password" ></v-text-field>
</v-form>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer> <v-btn dark color="pink">Login</v-btn>
</v-card-actions>
</v-card>
</v-flex>
</v-layout>
</template>
s
Для того, чтобы иметь возможность внутри компонентов Vue использовать jQuery, сразу необходимо установить зависимость jquery
npm install jquery --save
Теперь в любом компоненте, в теле script
мы можем импортировать эту зависимость и использовать функционал библиотеки jQuery.
import $ from 'jquery'; export default { name: "App", setup(){ console.log($('a:first').text()); // }, mounted() { console.log($('a:first').text()); // Home } }
Причём, обратите внимание, что работать со сформировавшимся шаблоном мы можем внутри функции mounded()
но не setup()
Выбрать препроцессоры (Sass/Less/Stylus) необходимо при создании проекта. Если вы этого не сделали, то внутренняя конфигурация webpack всё равно настроена для их использования. Вам лишь требуется вручную доустановить соответствующие загрузчики для webpack:
npm i node-sass sass-loader
vue-loader
позволяет использовать загрузчики webpack для обработки секций в однофайловых компонентах Vue. Они будут автоматически вызваны на основе указанного атрибута lang
у секции файла.
Теперь вы можете импортировать соответствующие типы файлов, или использовать их синтаксис внутри файлов *.vue
Препроцессор Sass поддерживает два синтаксиса: sass и scss. Они предусматривают одну и ту же функциональность, но используют разный синтоксис.
В sass
опущены все фигурные скопки и точки с запятой, а структура кода задаётся отступами (такая структура кода напоминает языки программирования Python и Ruby)
body color: green
Синтаксис scss
использует фигурные скопки и точки с запятой и похож на обычный css:
body { color: green }
Файлы scss имеют расширение .css
А файлы sass имеют расширение .sass
Стили приложения, которые должны быть подключены ко всем страницам, могут быть загружены в главный конфигурационный файл Vue.js.
Сперва создадим файл с именем vue.config.js в корне проекта на том же уровне, что и package.json. В нем мы собираемся определить некоторые параметры конфигурации. Вы можете прочитать больше об этом файле здесь.
Внутри него мы добавим оператор импорта:
module.exports = { css: { loaderOptions: { sass: { data: `@import "@/assets/scss/main.scss";` } } } };
Если же вы используете TypeScript, и в проекте имеется файл src/main.ts, то подключить стили можно в этом файле:
import "@/assets/scss/main.scss";
Теперь, в папке src/assets создадим папку scss, в ней два файла: main.scss и _variables.scss (по соглашению о присвоении имён SASS, в названии файла, содержащего переменные, используем символ нижнего подчёркивания _, но это не обязательно).
В файле _variables.scss будем держать переменные для стилей:
$primary: purple;
Теперь, в любом компоненте, в блоке со стилями, а также в других scss-файлах мы можем использовать эти переменные:
#app { color: $primary; }