Что такое vue router
Роутинг в Vue
ведущий разработчик NGRSOFTLAB
С появлением веб-приложений пришла потребность в смене URL-адресов с помощью JS. На помощь пришел History API браузера.
Благодаря этому все основные современные фреймворки позволяют программно управлять маршрутизацией с синхронизацией URL-адреса с представлением приложения.
Для маршрутизации во Vue-приложениях можно создать свою собственную интеграцию с History API, но лучше использовать официальную библиотеку от Vue — Vue-Router.
Базовые вещи
Использование можно начать хоть с установки с CDN:
Но мы начнем сразу с «правильного» варианта — с Vue Cli:
Создадим проект с помощью VUE CLI с базовым шаблоном — Default ([Vue 2] babel, eslint):
vue create vue-router-test-app
Минимальная конфигурация
Добавим в Main.js минимальную конфигурацию для роутера:
Иерархия путей
Добавим маршрут в main.js (массив routes ):
Зайдем по адресу http://localhost:8080/board. Увидим вторую страницу с отображением рендер-функции.
Параметры (Props) маршрута
Напомню, что рендер-функция в template-представлении будет выглядеть следующим образом:
Создадим компонент Board.vue с содержимым:
Перейдем по адресу http://localhost:8080/board/21 и увидим родительский и дочерний компоненты Board с передачей параметра id равным 21.
Если хотим более явно отобразить зависимость компонента от входных параметров, используем настройку props: true при настройке маршрута:
А в компоненте Board.vue принять id как входной параметр компонента:
Метаданные (meta) маршрута
Теперь мы можем обратиться к метаданным роута из компонента HelloWorld.vue следующим образом:
Глубже (nested children)
В дочерние компоненты можно углубляться до бесконечности (до ограничений сервера).
Сделаем дочерний роут для дочернего роута.
Рендер-функция теперь записана обычной функцией, т.к. нужен контекст компонента.
Передаем дочернему компоненту дочернего компонента параметры через компонент router-view как обычному компоненту. Звучит сложно, но интуитивно понятно. И так, спускаем пропсы в дочернем — дочернему дочернего:
Пояснение за Path
Запись вида path: «child» означает, что мы обращаемся к пути родителя и продолжаем его путь:
Из дочернего компонента можно сослаться на любой другой уровень роута:
Эта запись обрабатывает страницу с адресом: http://localhost:8080/first-level.
Шире (несколько router-view)
Перейдем по адресу: http://localhost:8080/board/23/child и увидим небольшой интерактив с переключением активных router-view.
Страница ошибки 404
Чтобы создать страницу ошибки, достаточно положить в конец списка маршрутов такую конструкцию:
Теперь, при переходе по несуществующему пути (например — http://localhost:8080/mistake), будет выведен компонент ошибки.
Лучше писать в таком виде:
Теперь у нас есть страница с ошибкой, куда мы можем со спокойной совестью переадресовывать пользователей (вдруг когда-нибудь понадобится это делать).
Защита маршрутов
Защиту маршрутов осуществляют с использованием метаданных маршрутов и хука beforeEach роутера.
Теперь, при попытке получить доступ к странице, которая требует авторизации, нас перебросит на страницу /auth-required.
Навигация между маршрутами
Программная навигация
Программная навигация может вызываться из любого места вашего приложения таким образом:
Если мы хотим передать параметры, нам нужно использовать другой подход, основанный на использовании имен роутов.
Укажем имя роуту /board/:id :
Теперь мы можем передавать параметры:
Получим ошибку «Invalid prop: type check failed for prop «id». Expected String with value «100500», got Number with value 100500».
Компонент routerLink
Компонент routerLink позволяет создавать ссылки внутри сайта, которые преобразуются в «нативные» браузерные ссылки (тег ):
К таким ссылкам автоматически могут добавляться классы:
Чтобы не отображать активный класс родительских, достаточно написать атрибут exact :
Мы можем переопределить создаваемый элемент:
К сожалению, в таком случае, классы не проставляются.
Также можем передавать объект:
Лучшие практики
Этот раздел мы посвятим рефакторингу того, что мы написали выше.
Создаем структуру папок для роутера:
Перенесем в router.js все, что касается настроек роутера:
Перенесем routes.js все, что касается настроек маршрутов.
И сразу заменим импорты на динамические.
Если у Вас уже прописано много роутов, ручное изменение может потребовать много времени. Поможет регулярка:
Теперь в Chrome Dev Tools во вкладке Network будет видно когда-какой компонент грузится из сети, а раньше все роуты загружались сразу в 1 мега-бандле.
Продвинутые приемы
Под «продвинутостью» подразумевается «приятность» их использования. К таким приемам можно отнести, например, такие темы как:
Итак, обо всем по-порядку.
Разбиение прав по уровням доступа
Бывает ситуация, когда у пользователей бывает более двух состояний: не только авторизация, но и другие. Например, платная подписка. С этих пор мы задумываемся про неограниченный уровень разделения прав. Делается это буквально парой десятков строчек кода, но для краткости, удобства и чтобы не изобретать велосипед, мы будем использовать готовую библиотеку. Установим ее:
yarn add vue-router-middleware-plugin
Создадим специальные файлы middleware для проверки прав пользователей:
В последнем листинге, приведен пример асинхронной проверки, что значит — можно обращаться в actions стора и делать запросы на сервер.
Теперь поставим проверку на авторизацию на все роуты, а затем сделаем исключения для некоторых роутов:
Теперь разберемся с конкретными маршрутами.
Поработаем над архитектурой нашего приложения, чтобы сделать его более предсказуемым. Сделаем отдельный шаблон Auth.vue и положим его в pages, а компоненты, которые там используются, т.е. в разделе /auth, положим в соответствующий раздел components.
Т.о. получается удобная структура:
Удаляем глобальную проверку на авторизацию в свойстве ignore и добавляем другую проверку в свойстве attach объекта meta.middleware :
с типовым шаблоном:
Соответственно, добавляем компоненты в соответствующую категорию в components:
Осталось отрефакторить главный компонент — App.vue:
Теперь, снимем отметку с «Logged In» и попробуем перейти по маршруту http://localhost:8080/board. Нас незамедлительно переадресует на страницу «auth-required».
Поставим отметку на «Logged In», снимем с «Has License» и перейдем по маршруту http://localhost:8080/board/33/child. Нас перенесет на страницу license, однако, если снять отметку с «Logged In» и обновить страницу, то мы снова перейдем на страницу «auth-required».
Теперь проверим, можно ли зайти на страницу авторизации, когда пользователь уже прошел авторизацию. Поставим отметку «Logged In» и перейдем по адресу http://localhost:8080/auth/register. Нас перебросит на главную страницу.
Анимация переходов между страницами
Это просто. Оборачиваем главный RouterView компонентом анимации transition и добавляем стили:
Индикация загрузки при переходе между роутами
Это тоже просто. Ставим библиотеку nprogress:
yarn add nprogress
Добавляем в router.js:
Изменение тайтлов при переходе между роутами
Заполняем meta.title маршрутам и ставим document.title каждой странице в хуке beforeEach :
Плавный скролл по странице при переходе вперед/назад
Когда жмешь по браузерным «системным» кнопкам назад или вперед, браузер запоминает положение прокрутки и возвращает. Такое поведение мы можем повторить.
Как использовать маршрутизацию Vue.js Router для разработки лучшего опыта пользователя
Дата публикации: 2018-07-30
От автора: Vue.js — отличная JavaScript платформа, созданная Эваном Ю. Она используется для разработки отдельных приложений для веб-страниц и гибких компонентов, это также один из самых необходимых навыков при разработке Front End.
Vue.js предоставляет множество функций, которые позволяют создавать повторно используемые веб-компоненты. Маршрутизация — одна из таких функций. Она позволяет пользователю переключаться между страницами без обновления страницы. Это то, что делает навигацию в веб-приложениях простой и очень приятной. Итак, в этой статье я объясню, как работают маршрутизаторы Vue.js, создав в качестве примера шаблона Vue.js Router.
Приступаем к работе
Итак, давайте начнем с создания проекта Vue.js Router, установив и создав новый проект Vue.js. Нам нужно установить Node.js. Для создания нового проекта Vue.js мы будем использовать vue-cli. Выполните следующие действия. Введите и запустите в терминале следующий код:
Фреймворк VUE JS: быстрый старт
Получите бесплатный курс и узнайте, как создать веб-приложение на трендовой Frontend-технологии VUE JS с полного нуля
Перейдите по адресу //localhost:8080
Откройте приложение в текстовом редакторе. В папке компонентов откройте файл HellowWorld.vue и выполните следующие действия. Переименуйте HellowWorld.vue в home.vue. Удалите из файла весь код и замените его следующим:
Перейдите к файлу index.js в папке router и замените HelloWorld на home:
Файл App.vue должен выглядеть следующим образом:
А теперь давайте напишем наш код!
Мы добавим шаблон Bootswatch. Вы можете выбрать любой шаблон по своему усмотрению. Я выбираю Cosmo. Нажмите Ctrl + U, чтобы просмотреть исходный кода и просто скопируйте Navbar (нам нужен только navbar). Вставьте этот код в компонент App.vue.
Вот что у нас получилось:
Затем мы собираемся создать три других компонента: Blog,Services и Contact. Внутри папки компонентов создайте новый файл, назовите его blog.vue и вставьте в него этот код:
Если вы хотите сделать то же самое для компонентов Services и Contact, вам нужно создать следующие файлы в папке компонентов:
Настройка маршрутизаторов
После того, как вы создали эти четыре компонента, нам нужно настроить маршрутизаторы, чтобы мы могли перемещаться между компонентами.
Итак, как мы можем переходить к каждому компоненту с помощью маршрутизаторов? Нам нужно изучить правила маршрутизации. Теперь нам нужно внести некоторые изменения в папки маршрутизаторов, поэтому откройте файл index.js
Выполните следующие действия. Сначала импортируйте компоненты в index.js. Импортируйте все компоненты с помощью метода import.
Далее импортируйте Vue и модуль маршрутизатора из модуля vue-router:
Если вы установили Vue с vue-cli, модуль vue-router будет импортирован у вас по умолчанию.
И, наконец, в папке маршрутизаторов мы должны настроить маршрутизаторы, чтобы они заработали. Метод маршрутизатора принимает массив объектов, который, в свою очередь, принимает свойства каждого компонента:
path: путь компонента
name: имя компонента
component: представление компонента
Чтобы компонент являлся компонентом по умолчанию, добавьте слэш (‘/’) в свойство path:
В нашем примере мы установили главную страницу в качестве страницы по умолчанию. Теперь, когда вы открываете проект в браузере, первой отображаемой страницей будет главная.
У маршрутизатора vue есть более продвинутые параметры и методы, но на данном этапе мы этой темы касаться не будем. Это список свойств и методов, которые можно использовать с vue-router:
Теперь вы можете просматривать любые компоненты, введя имя компонента!
router-link принимает атрибут to=’path’, который принимает в качестве значения путь к компоненту.
Router-view
Вы найдете тег в файле App.vue. Это в основном представление, в котором отображаются компоненты. Оно похоже на главный div, содержащий все компоненты, и возвращает компонент, соответствующий текущему маршруту. Мы рассмотрим маршруты в следующей части, когда используем анимацию перехода.
Использование параметров внутри маршрутизаторов
На этом этапе мы будем использовать параметры для перехода к конкретным компонентам. Параметры делают маршрутизацию динамической.
Для работы с параметрами мы создадим список товаров и массив данных. Когда вы нажимаете на ссылку какого-либо товара, вы с помощью параметра переходите к информации о товаре.
В данном случае мы не будем использовать базу данных или API для извлечения информации о товарах. Поэтому нам нужно создать массив товаров, который будет выполнять роль базы данных. Внутри компонента home.vue поместите массив в метод data() следующим образом:
Фреймворк VUE JS: быстрый старт, первые результаты
Получите бесплатный курс и узнайте, как создать веб-приложение на трендовой Frontend-технологии VUE JS с полного нуля
Маршрутизатор Vue
Как использовать Vue Router, одну из важнейших частей приложения Vue
Вступление
Другими словами, это часть, которая заставляет URL-адрес изменяться, когда вы щелкаете что-либо на странице, и помогает отображать правильное представление, когда вы нажимаете определенный URL-адрес.
Традиционно Интернет строится вокруг URL-адресов. Когда вы нажимаете определенный URL-адрес, отображается определенная страница.
С появлением приложений, которые запускаются внутри браузера и изменяют то, что видит пользователь, многие приложения прервали это взаимодействие, и вам пришлось вручную обновлять URL-адрес с помощью History API браузера.
Маршрутизатор необходим, когда вам нужно синхронизировать URL-адреса с представлениями в вашем приложении. Это очень распространенная потребность, и теперь все основные современные фреймворки позволяют управлять маршрутизацией.
Это означает, что его поддерживают те же люди, которые поддерживают Vue, поэтому вы получаете более последовательную интеграцию в фреймворк и гарантию того, что он всегда будет совместим в будущем, несмотря ни на что.
Установка
Если вы используете Vue через тег скрипта, вы можете включить Vue Router, используя
Если вы используетеVue CLI, установите его, используя
После установки vue-router и сделать его доступным либо с помощью тега скрипта, либо через Vue CLI, теперь вы можете импортировать его в свое приложение.
После того, как вы позвоните Vue.use() передавая объект маршрутизатора, в любом компоненте приложения у вас есть доступ к этим объектам:
Объект маршрутизатора
Объект маршрутизатора, доступ к которому осуществляется с помощью this.$router из любого компонента, когда Vue Router установлен в корневом компоненте Vue, предлагает множество приятных функций.
Мы можем заставить приложение переходить по новому маршруту, используя
push() используется для перехода к новому маршруту, добавляя новый элемент в историю браузера. replace() то же самое, за исключением того, что он не помещает новое состояние в историю.
go() идет туда и обратно, принимая число, которое может быть положительным или отрицательным, чтобы вернуться в историю:
Определение маршрутов
В шаблоне я использую nav tag that has 3 router-link компоненты, которые имеют метку (Home / Login / About) и URL-адрес, назначенный через to атрибут.
А router-link компонент рендерит a тег по умолчанию (вы можете изменить это). Каждый раз, когда маршрут изменяется, щелкнув ссылку или изменив URL-адрес, router-link-active Класс добавляется к элементу, который ссылается на активный маршрут, что позволяет вам стилизовать его.
In the JavaScript part we first include and install the router, then we define 3 компоненты маршрута.
Передаем их на инициализацию router объект, и мы передаем этот объект корневому экземпляру Vue.
Обычно в приложении Vue вы создаете и монтируете корневое приложение, используя:
Синтаксис, использованный в приведенном выше примере:
это сокращение для
Смотрите в примере, мы передаем routes массив в VueRouter конструктор. Каждый маршрут в этом массиве имеет path и component параметры
Если вы пройдете name param тоже у вас естьназванный маршрут.
Использование именованных маршрутов для передачи параметров в методы push и replace роутера
Помните, как мы раньше использовали объект Router для перехода к новому состоянию?
С помощью именованного маршрута мы можем передать параметры новому маршруту:
то же самое касается replace() :
Что происходит, когда пользователь нажимает router-link
Приложение отобразит компонент маршрута, соответствующий URL-адресу, переданному по ссылке.
Создается экземпляр нового компонента маршрута, который обрабатывает URL, и вызываются его средства защиты, а старый компонент маршрута будет уничтожен.
Маршрутная охрана
Поскольку мы упоминалиохранники, давайте познакомим их.
Вы можете думать о них как о хуках жизненного цикла или промежуточном программном обеспечении, это функции, вызываемые в определенное время во время выполнения приложения. Вы можете вмешаться и изменить выполнение маршрута, перенаправив или отменив запрос.
Вы можете иметь глобальную охрану, добавив обратный вызов в beforeEach() и afterEach() свойство роутера.
Что означает «навигация подтверждена»? Мы увидим это через секунду. А пока думайте об этом как о том, что «приложение может пойти по этому маршруту».
to и from представляют собой объекты маршрута, к которым мы идем и от которых. beforeEach имеет дополнительный параметр next что, если мы позвоним с false в качестве параметра заблокирует навигацию и приведет к ее неподтверждению. Как и в промежуточном программном обеспечении Node, если вы знакомы, всегда следует вызывать next (), иначе выполнение зависнет.
Компоненты одиночного маршрута также имеют охранники:
Мы упомянули навигацию. Чтобы определить, подтверждена ли навигация по маршруту, Vue Router выполняет некоторые проверки:
Вы можете использовать специальные охранники для маршрута ( beforeRouteEnter и beforeRouteUpdate в случае динамической маршрутизации) в качестве хуков жизненного цикла, чтобы вы могли начатьзапросы на выборку данныхНапример.
Динамическая маршрутизация
Вы можете добиться этого, используя динамический сегмент.
Это были статические сегменты:
мы добавляем динамический сегмент для обработки сообщений в блогах:
Обратите внимание на :post_slug синтаксис. Это означает, что вы можете использовать любую строку, и она будет сопоставлена post_slug заполнитель.
Вы не ограничены таким синтаксисом. Vue полагается наэта библиотекадля анализа динамических маршрутов, и вы можете сойти с ума сОбычные выражения.
Мы можем использовать этот параметр для загрузки содержимого из серверной части.
Вы можете иметь столько динамических сегментов, сколько хотите, в одном URL:
Помните, как раньше мы говорили о том, что происходит, когда пользователь переходит на новый маршрут?
В случае динамических маршрутов происходит немного другое.
Чтобы Vue был более эффективным, вместо того, чтобы уничтожать текущий компонент маршрута и повторно создавать его, он повторно использует текущий экземпляр.
Когда это происходит, Vue вызывает beforeRouteUpdate событие жизненного цикла. Там вы можете выполнить любую нужную вам операцию:
Использование реквизита
Обратите внимание на props: true передается объекту маршрута, чтобы включить эту функцию.
Вложенные маршруты
Раньше я упоминал, что вы можете иметь столько динамических сегментов, сколько хотите, в одном и том же URL-адресе, например:
Итак, допустим, у нас есть компонент Author, который заботится о первом динамическом сегменте:
Мы можем вставить вторую router-view экземпляр компонента внутри шаблона Author:
добавляем компонент Post:
а затем мы добавим внутренний динамический маршрут в конфигурацию VueRouter:
How to Use Vue Router: A Complete Tutorial
One of the most powerful features of modern single-page web applications (SPA) is routing. Modern single-page apps such as a Vue application can transition from page to page on the client-side (without requesting the server). Vue Router is the official library for page navigation in Vue applications. Vue Router is simple to use, yet powerful. In this article, we will deep dive into Vue Router 4 (used with Vue 3). We will go over everything you need to know to use Vue Router comfortably.
Whether you are a beginner just getting into Vue Router or a seasoned JavaScript/Vue developer looking to skill up, there’s something for you in this tutorial. Let’s get started.
👉 We have also created a completely free in-depth Vue Router video course. If you learn better by watching videos, we highly recommend you give it a shot. Click here to watch the Vue Router course.
Vue Router Fundamentals
Next we can add the Vue Router to our project by running the following command.
The cli will ask if we want history mode. For this tutorial we’ll be using history mode, so we’ll select yes.
Let’s take a look at the folder structure that was created for us.
We are pretty much following the same logic for the /about the path. However, instead of directly importing the component we are importing it through Webpack’s code splitting feature. More on this later.
Now let’s jump into App.vue file.
Let’s add our own route to this application.
Finally, in our routes array we have to import this and specify the route path.
That’s it we have our own routes added to the application.
How to use router params with Vue Router
First of all, let’s take a look at what router parameters (router params in short) are and why they are important. Let’s say we have a page in our application where we show users a list of all the blog posts available.
Let’s see this in action inside our application.
In our router-link tag we can use the :to property to pass in an object with name and params data. The params object can be any type of data (i.e. strings, numbers, objects). In the code snippet above we are passing in an object with username with a string value (mark2021).
How to access route params from the view
Dynamic Routing
Below is a quick reference table to help you visualize how dynamic routes work.
route pattern | URL path | $this.route.params |
---|---|---|
/product/:name | /product/apple-watch | |
/product/:name/comment/:comment_id | /product/apple-watch/comment/123 |
Now we can add this component to our routes.
Notice we appended a dynamic parameter to :id to the URL. Now if you visit http://localhost:8080/product/12343 in our browser you can see that the component will have access to the dynamic parameter that was passed through the URL.
We could then use this Id to fetch the actual product from our API in a lifecycle hook.
Let’s take a look at how it works. we will first make some quick changes in our product route.
Lazy loading
Let’s talk about lazy loading. This is one of the advanced features that Vue Router provides out of the box. Let’s open up our devtools and observe the js tab.
When we lazy load, we load only the parts we need, when we need them.
We can update our code to use lazy loading for each route.
💡 If you are looking to distinguish yourself as a developer with a deep understanding of Vue then give our Vue 3 Masterclass a shot. In this course, we delve deep into some of the advanced features of Vue such as higher-order functions, code splitting, Webpack configuration, creating vue plugins, route guards and much more.
Programmatic Navigation
Where to go from here
I hope this article gave you an overview of the different functionalities of Vue Router. We discussed the most important and commonly used features of Vue Router. Feel free to visit the vue router documentation for more in-depth details about the various APIs. Here at VueSchool we have created a completely free course on Vue Router. For more in-depth Vue learning material you can also take a look at our Vue 3 Masterclass course.
That’s all for today, happy hacking.
Article written by Shadid Haque
Shadid is a software craftsman, open-source contributor, with a passion for web application development. He’s been working as a software engineer for the past 5 years in Toronto, Canada. He loves everything JavaScript. Currently working with Vue, React, and Graphql.