Vue.js - это простой в использовании фреймворк для веб-приложений, который мы можем использовать для разработки интерактивных интерфейсных приложений.
В этой статье мы рассмотрим, как динамически перемещаться по маршрутам Vue Router.
Программная навигация
Мы можем перемещаться по маршрутам программно в дополнение к использованию router-link
для создания ссылки, позволяющей пользователям перемещаться по маршрутам.
router.push (расположение, onComplete ?, onAbort?)
Для этого мы можем использовать экземпляр $router
, доступный компоненту, для программной навигации по маршрутам.
router.push(…)
вызывается при нажатии router-link
ссылки. Мы можем назвать это сами программной навигацией по маршрутам.
Например, мы можем определять маршруты и перемещаться по ним программно следующим образом:
src/index.js
:
const Foo = { template: "<p>foo</p>" }; const Bar = { template: "<p>bar</p>" }; const routes = [ { path: "/foo", component: Foo }, { path: "/bar", component: Bar } ]; const router = new VueRouter({ routes }); new Vue({ el: "#app", router, methods: { goTo(route) { this.$router.push(route); } } });
index.html
:
<!DOCTYPE html> <html> <head> <title>App</title> <meta charset="UTF-8" /> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> </head> <body> <div id="app"> <div> <a href="#" @click='goTo("foo")'>Foo</a> <a href="#" @click='goTo("bar")'>Bar</a> </div> <router-view></router-view> </div> <script src="src/index.js"></script> </body> </html>
В приведенном выше коде у нас есть метод goTo
, который принимает строку для маршрута, по которому мы хотим перейти.
В этом методе мы вызываем this.$router.push(route);
, чтобы перейти к нужному маршруту.
Итак, когда мы нажимаем Foo
, мы видим foo
, а когда мы нажимаем Bar
, мы видим bar
.
Мы также можем передать объект следующим образом:
this.$router.push({ path: route });
Кроме того, мы можем перейти к именованным маршрутам, когда $router.push
. Для этого пишем:
src/index.js
:
const Foo = { template: "<p>foo</p>" }; const Bar = { template: "<p>bar</p>" }; const routes = [ { name: "foo", path: "/foo", component: Foo }, { name: "bar", path: "/bar", component: Bar } ]; const router = new VueRouter({ routes }); new Vue({ el: "#app", router, methods: { goTo(name) { this.$router.push({ name }); } } });
index.html
:
<!DOCTYPE html> <html> <head> <title>App</title> <meta charset="UTF-8" /> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> </head> <body> <div id="app"> <div> <a href="#" @click='goTo("foo")'>Foo</a> <a href="#" @click='goTo("bar")'>Bar</a> </div> <router-view></router-view> </div> <script src="src/index.js"></script> </body> </html>
В приведенном выше коде мы определили именованные маршруты, добавив свойство name
к нашим маршрутам, написав:
const routes = [ { name: "foo", path: "/foo", component: Foo }, { name: "bar", path: "/bar", component: Bar } ];
Затем мы можем перейти к маршруту по имени следующим образом в методе goTo
:
this.$router.push({ name });
Мы можем передать параметры маршрута следующим образом:
router.push({ name: 'user', params: { userId: '123' } })
Следующее не будет работать:
router.push({ path: 'user', params: { userId: '123' } })
Мы можем перейти к маршрутам со строками запроса следующим образом:
router.push({ path: 'user', query: { userId: '123' } })
or:
router.push({ name: 'user', query: { userId: '123' } })
Мы также можем пойти по пути с параметром маршрута следующим образом:
router.push({ path: `/user/123` });
Например, мы можем использовать их следующим образом:
const Foo = { template: "<p>foo {{$route.query.id}}</p>" }; const Bar = { template: "<p>bar</p>" }; const routes = [ { path: "/foo", component: Foo }, { path: "/bar", component: Bar } ]; const router = new VueRouter({ routes }); new Vue({ el: "#app", router, methods: { goTo(path, query) { this.$router.push({ path, query }); } } });
Затем мы видим foo 1
, когда щелкаем по Foo
, поскольку мы берем строку запроса с id
в качестве ключа.
Это то же самое, что перейти к /#/foo?id=1
в браузере.
Те же правила применяются к свойству to
компонента router-link
.
В Vue Router 2.2.0 или новее мы можем дополнительно предоставить обратные вызовы onComplete
и onAbort
для router.push
или router.replace
в качестве 2-го и 3-го аргументов.
В Vue Router 3.1.0+. router.push
и router.replace
вернут обещания, и нам не нужно передавать 2-й и 3-й аргументы для обработки этих случаев.
Если наш пункт назначения совпадает с текущим маршрутом, и меняются только параметры, например с /users/1
на /users/2
, тогда мы должны использовать ловушку beforeRouteUpdate
, чтобы реагировать на изменения.
router.replace (расположение, onComplete ?, onAbort?)
router.replace
действует как router.push
, за исключением того, что не добавляется новая запись в историю.
router.replace(…)
совпадает с <router-link :to=”…” replace>
.
router.go (сущ.)
Мы можем использовать router.go
для перехода вперед или назад, передав целое число для количества шагов вперед или назад. Негатив - это назад, а положительный - вперед.
Например, мы можем использовать это так:
src/index.js
:
const Foo = { template: "<p>foo</p>" }; const Bar = { template: "<p>bar</p>" }; const routes = [ { path: "/foo", component: Foo }, { path: "/bar", component: Bar } ]; const router = new VueRouter({ routes }); new Vue({ el: "#app", router, methods: { forward() { this.$router.go(-1); }, back() { this.$router.go(1); } } });
index.html
:
<!DOCTYPE html> <html> <head> <title>App</title> <meta charset="UTF-8" /> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> </head> <body> <div id="app"> <div> <router-link to="foo">Foo</router-link> <router-link to="bar">Bar</router-link> <a href="#" @click="forward">Forward</a> <a href="#" @click="back">Back</a> </div> <router-view></router-view> </div> <script src="src/index.js"></script> </body> </html>
Нам нужны методы forward
и back
для перемещения вперед и назад соответственно.
router.go
выдаст ошибку, если такой записи в истории не существует.
Заключение
У нас есть router.push
метод для перехода к пути с другими именами, путями, строкой запроса или параметрами.
Точно так же мы можем сделать то же самое с router.replace
, но без добавления новой записи в историю.
Оба они принимают строку или объект в качестве маршрута и обработчики onComplete
и onAbort
.
router.go
позволяет нам перемещаться вперед и назад в истории браузера. Для перехода вперед или назад требуется несколько шагов.
Примечание из JavaScript In Plain English
Мы запустили три новых издания! Проявите любовь к нашим новым публикациям, подписавшись на них: AI на простом английском, UX на простом английском, Python на простом английском - спасибо и продолжайте учиться!
Мы также всегда заинтересованы в продвижении качественного контента. Если у вас есть статья, которую вы хотели бы отправить в какую-либо из наших публикаций, отправьте нам электронное письмо по адресу [email protected] с вашим именем пользователя Medium, и мы добавим вас в качестве автора. Также сообщите нам, к каким публикациям вы хотите быть добавлены.