Vue-router on vue.js -kirjasto sivujen reititykseen.
Konffataan router
import Vue from 'vue'
import Router from 'vue-router'
import Home from './home.vue'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'home',
component: Home
}
]
})
ja lisätään se Vue -instanssiin
import Vue from 'vue'
import App from './App.vue'
import router from './router'
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App)
}).$mount('#app')
Reitillä määritellään vähintään polku ja komponentti
// ...
import Home from './home.vue'
import ProductList from './products.vue'
export default new Router({
routes: [
{
path: '/',
component: Home
},
{
path: '/products',
component: ProductList
}
]
})
Polkuun voi määritellä myös parametreja laittamalla polun osan eteen :
{
path: '/products/:id',
component: ProductDetails
}
Reitille voi lisäksi määritellä nimen
{
path: '/products/:id',
name: 'ProductDetails',
component: ProductDetails
}
Templatessa voi käyttää router-link -elementtiä
<router-link to="/products">Products</router-link>
<router-link :to="'/products/' + product.id">{{ product.name }}</router-link>
<router-link :to="{ name: 'ProductDetails', params: { id: product.id }}">{{ product.name }}</router-link>
Skriptissä on käytettävissä $router -objekti. push lisää uuden reitin entisten perään, jolloin selaimen edellinen-painike tuo takaisin nykyiselle sivulle. replace korvaa nykyisen reitin. go navigoi tietyn määrän sivuja eteen tai taakse
this.$router.push('/products');
this.$router.push({name: 'ProductDetails', params: { id: product.id }});
this.$router.go(-1); // edellinen sivu
this.$router.go(2); // 2 sivua eteenpäin
Komponentissa on käytettävissä $route -objekti, jossa on nykyisen reitin tiedot
export default {
methods: {
load(){
var id = this.$route.params.id;
api.getProduct(id).then(data => {
});
}
},
created(){
this.load();
}
}
Parametrien muutosta voi tarkkailla normaalisti watch -metodilla
export default {
watch: {
'$route'(newRoute, oldRoute){
this.load();
}
}
}
Alireitit laitetaan children -taulukkoon
{
path: '/',
component: Layout,
children: [
{
path: '',
component: Home
},
{
path: 'products',
component: ProductList
}
]
}
Templatessa router-view -elementti korvataan reitin mukaisella komponentilla
<div id="app">
<section>
<main-menu />
</section>
<section>
<router-view></router-view>
</section>
</div>
On mahdollista käyttää useampaa router-view -elementtiä. Tällöin ne täytyy nimetä (yksi voi olla nimetön => default)
<div id="app">
<section>
<router-view name="menu"></router-view>
</section>
<section>
<router-view></router-view>
</section>
</div>
Tällöin reittiin lisätään tieto mikä komponentti menee mihinkäkin näkymään
{
path: 'products/:id',
components: {
menu: ProductMenu,
default: ProductDetails
}
}
Reitteihin voi lisätä metatietoja, jotka eivät näy selaimen osoitepalkissa
{
path: 'bugs',
component: Issues,
meta: { type: 'Bug' }
},
{
path: 'feature-requests',
component: Issues,
meta: { type: 'FeatureRequest' }
}
Ja niihin pääsee kiinni $route.meta -kentästä
export default {
created(){
if(this.$route.meta.type === 'Bug'){
api.getBugs().then(data => {
// ...
});
}
else if(this.$route.meta.type === 'FeatureRequest'){
api.getFeatureRequests().then(data => {
// ...
});
}
}
}
query on vielä yksi tapa välittää parametreja komponentille
<router-link :to="{ name: 'ProductDetails', params: {id: product.id}, query: { tab: 'stock'}}"></router-link>
showProductStock(product){
this.$router.push({ name: 'ProductDetails', params: {id: product.id}, query: { tab: 'stock'}});
}
Ja arvon saa luettua $route.query -kentästä
created(){
this.tab = this.$route.query.tab;
}