Aside from using <router-link>
to create anchor tags for declarative navigation, we can do this programmatically using the router's instance methods.
router.push(location, onComplete?, onAbort?)
Note: Inside of a Vue instance, you have access to the router instance as $router
. You can therefore call this.$router.push
.
To navigate to a different URL, use router.push
. This method pushes a new entry into the history stack, so when the user clicks the browser back button they will be taken to the previous URL.
This is the method called internally when you click a <router-link>
, so clicking <router-link :to="...">
is the equivalent of calling router.push(...)
.
Declarative | Programmatic |
---|---|
<router-link :to="..."> | router.push(...) |
The argument can be a string path, or a location descriptor object. Examples:
// literal string path
router.push('home')
// object
router.push({ path: 'home' })
// named route
router.push({ name: 'user', params: { userId: '123' } })
// with query, resulting in /register?plan=private
router.push({ path: 'register', query: { plan: 'private' } })
Note: params
are ignored if a path
is provided, which is not the case for query
, as shown in the example above. Instead, you need to provide the name
of the route or manually specify the whole path
with any parameter:
const userId = '123'
router.push({ name: 'user', params: { userId } }) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// This will NOT work
router.push({ path: '/user', params: { userId } }) // -> /user
The same rules apply for the to
property of the router-link
component.
In 2.2.0+, optionally provide onComplete
and onAbort
callbacks to router.push
or router.replace
as the 2nd and 3rd arguments. These callbacks will be called when the navigation either successfully completed (after all async hooks are resolved), or aborted (navigated to the same route, or to a different route before current navigation has finished), respectively. In 3.1.0+, you can omit the 2nd and 3rd parameter and router.push
/router.replace
will return a promise instead if Promises are supported.
Note: If the destination is the same as the current route and only params are changing (e.g. going from one profile to another /users/1
-> /users/2
), you will have to use beforeRouteUpdate
to react to changes (e.g. fetching the user information).
router.replace(location, onComplete?, onAbort?)
It acts like router.push
, the only difference is that it navigates without pushing a new history entry, as its name suggests - it replaces the current entry.
Declarative | Programmatic |
---|---|
<router-link :to="..." replace> | router.replace(...) |
router.go(n)
This method takes a single integer as parameter that indicates by how many steps to go forwards or go backwards in the history stack, similar to window.history.go(n)
.
Examples
// go forward by one record, the same as history.forward()
router.go(1)
// go back by one record, the same as history.back()
router.go(-1)
// go forward by 3 records
router.go(3)
// fails silently if there aren't that many records.
router.go(-100)
router.go(100)
You may have noticed that router.push
, router.replace
and router.go
are counterparts of window.history.pushState
, window.history.replaceState
and window.history.go
, and they do imitate the window.history
APIs.
Therefore, if you are already familiar with Browser History APIs, manipulating history will be super easy with Vue Router.
It is worth mentioning that Vue Router navigation methods (push
, replace
, go
) work consistently in all router modes (history
, hash
and abstract
).
© 2013–present Evan You
Licensed under the MIT License.
https://router.vuejs.org/guide/essentials/navigation.html