Phoenix, Brunch and VueJS: Part 3
Phoenix, Brunch and VueJS - Part 3: routing with Vue-Router
Client-side routing became a common pattern. So many applications are designed as Single Page Applications, and it requires a system to map page addresses to page components.
VueJS gives us Vue-Router, a tool that allows us to do that client-side URL mapping.
Let’s see how to use it!
Installing Vue-Router dependency
The first step in order to use Vue Router, is to install this new component. We can do that simply installing a new NPM package called vue-router, pretty simple, isn’t it?
phoenix_vue/ $ cd assets
../assets/ $ npm install --save vue-router
After having vue-router installed, using it is a blaze.
Enabling Vue-Router in our Vue application
In order to play with Vue-Router, we need to tell Vue that we are using this new tool.
It is pretty straight forward to do that, first, we import VueRouter in our app.js
:
import VueRouter from 'vue-router'
After importing Vue-Router inside our app.js
file, we tell Vue to use this new component:
Vue.use(VueRouter)
Now our application is Vue-Router enabled!
A second Hello World component
In order to test Vue-Router, we need to create a new component. Let’s keep it very simple
and build a component similar to Hello.vue
component, we created in the previous post.
We will name it: world.vue
(and now we have Hello World! Amazing, isn’t it?)
Open a new file assets/js/vue/world.vue
:
<template>
<div>
<input type="text" v-model="name" placeholder="Your name to yell"></input>
<button @click.prevent="doYell">Yell my name</button>
</div>
</template>
<style scoped>
a {
color: #AA9080;
background-color: #2020AA;
}
</style>
<script>
export default {
data () {
return {
name: ''
}
},
methods: {
doYell() {
var name = this.name.toUpperCase();
alert(name);
}
}
}
</script>
This is very similar to Hello.vue
, but instead of saying, it will YELL. Very creative!
Besides creating this new component, we also need to import it in assets/js/app.js
to make it visible for Vue-Router routes:
import World from './vue/world.vue'
We are done with this new World.vue
component, let’s create some routes!
Creating our first routes
Now we have two components, hello.vue
and world.vue
, we can define some routes
inside Vue-Router, inside assets/js/app.js
, after using Vue, let’s define a object
that maps some urls to components:
const routes = [
{path: '/', component: Hello},
{path: '/my-hello', component: Hello},
{path: '/my-world', component: World}
]
These routing rules are pretty basic, we define a default component for /
and two urls,
one for each of our Hello.vue
World.vue
components.
Instancing our Vue-Router
We have two components, we have some routes defined, let’s apply them to our sandbox!
The first step is to instance Vue-Router with our defined routes:
const router = new VueRouter({
routes
})
With this small piece of code, we are instancing VueRouter with our defined routes, after that, we only need to mount VueRouter somewhere.
Mounting Vue-Router
Mounting in Vue is the act of applying a component in our so loved HTML DOM, we do that
by creating a new Vue instance with our router
:
const app = new Vue({
router
}).$mount('#router-main')
We will be mounting in a new div called #router-main
, let’s add this new div
to web/templates/page/index.html.eex
:
<h1>Vue-Router playground</h1>
<div id="router-main">
<router-link to="/my-hello">Hello</router-link>
|
<router-link to="/my-world">World</router-link>
<router-view></router-view>
</div>
Inside this #router-main
div, we have two new concepts: router-view
and router-link
. A router-view
is where Vue-Router will place it’s currently routed component. A router-link
is a Vue-Router tool to generate their routing links.
Result
We learned how to install, import and use Vue-Router. Also, we created some sample routes
and placed the router-view
and some router-link
s in the sandbox project.
Here is the resulting component displayed in our browser:
GitHub Repository
This guide source code was posted at:
https://github.com/frbaroni/phoenix_brunch_vuejs
Each commit represents one step.