Preamble
Hello everyone, continue with the vuejs series today, I would like to introduce you to the Vue router.
Currently, one-page SPA (Single Page Application) is becoming more and more popular. As a web page only on one page, ie instead of loading the whole website to get all the content that has been loaded before, SPA will task to load only the parts that need to be changed. No need to load to reduce server load and make our site faster, more professional. Specially made for a better user experience.
What is Vue Router?
Vue Router is the official router for Vue.js. It integrates deeply with the Vue.js core to make it easy to build Single Page Applications with Vue.js.
User manual
In this post, I will try to demo with laravel 5.8. First you need to install laravel:
1 2 | composer create <span class="token operator">-</span> project <span class="token operator">--</span> prefer <span class="token operator">-</span> dist laravel <span class="token operator">/</span> laravel vue_router <span class="token number">5.8</span> <span class="token punctuation">.</span> <span class="token operator">*</span> |
Next I install the router vue
1 2 | npm install <span class="token operator">--</span> save vue vue <span class="token operator">-</span> router |
Because laravel has already integrated vuejs into the project, we don’t need to do much. Just embed the script file we built into.
We will navigate the default laravel into a single file view as follows:
1 2 3 | Route <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token function">view</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/{any}'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'home'</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token function">where</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'any'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'.*'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Here at my web.php
file, the web.php
router navigates to a single view file. In this view file will embed the js file we have built and from there this js file will navigate to the required views.
at file view home.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token operator"><</span> <span class="token operator">!</span> <span class="token constant">DOCTYPE</span> <span class="token constant">HTML</span> <span class="token keyword">PUBLIC</span> <span class="token double-quoted-string string">"-//W3C//DTD HTML 4.01//EN"</span> <span class="token double-quoted-string string">"http://www.w3.org/TR/html4/strict.dtd"</span> <span class="token operator">></span> <span class="token operator"><</span> html lang <span class="token operator">=</span> <span class="token double-quoted-string string">"en"</span> <span class="token operator">></span> <span class="token operator"><</span> head <span class="token operator">></span> <span class="token operator"><</span> meta http <span class="token operator">-</span> equiv <span class="token operator">=</span> <span class="token double-quoted-string string">"Content-Type"</span> content <span class="token operator">=</span> <span class="token double-quoted-string string">"text/html;charset=UTF-8"</span> <span class="token operator">></span> <span class="token operator"><</span> title <span class="token operator">></span> Home <span class="token operator"><</span> <span class="token operator">/</span> title <span class="token operator">></span> <span class="token operator"><</span> link rel <span class="token operator">=</span> <span class="token double-quoted-string string">"stylesheet"</span> href <span class="token operator">=</span> <span class="token double-quoted-string string">"/css/style.css"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> head <span class="token operator">></span> <span class="token operator"><</span> body <span class="token operator">></span> <span class="token operator"><</span> div id <span class="token operator">=</span> <span class="token double-quoted-string string">"app"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> script src <span class="token operator">=</span> <span class="token double-quoted-string string">"/js/app.js"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> body <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> html <span class="token operator">></span> |
As you can see, I only embed the app.js file built from vuejs components and other necessary js files. Laravel is configured to build these files in webpack.mix.js file using the Laravel mix. You can see more about Laravel mix in this article of mine. And after the build is complete we have the file at public/app.js
and from there we just need to import into our home view file. To build you execute the command
1 2 3 4 | npm run dev hoặc npm run watch <span class="token comment">// lệnh này sẽ theo dõi luôn khi nào có file thay đổi sẽ build lại cho chúng ta luôn.</span> |
Next I will create 3 components as follows: I will create 3 components in resource / js / components directory
1 2 3 4 | App - component chính Home - component cho trang home User - component cho trang user |
The content of these 3 files will be as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <span class="token comment">//App.vue</span> <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"container"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"header"</span> <span class="token operator">></span> <span class="token operator"><</span> ul <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav justify-content-center"</span> <span class="token operator">></span> <span class="token operator"><</span> li <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav-item"</span> <span class="token operator">></span> <span class="token operator"><</span> a href <span class="token operator">=</span> <span class="token string">""</span> <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav-link"</span> <span class="token operator">></span> Home <span class="token operator"><</span> <span class="token operator">/</span> a <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> li <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav-item"</span> <span class="token operator">></span> <span class="token operator"><</span> a href <span class="token operator">=</span> <span class="token string">""</span> <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav-link"</span> <span class="token operator">></span> User <span class="token operator"><</span> <span class="token operator">/</span> a <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> ul <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"main mt-4"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"row"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"col-md-8 offset-2 text-center"</span> <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> This is App component <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'App'</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> style <span class="token operator">></span> <span class="token punctuation">.</span> container <span class="token punctuation">{</span> border <span class="token punctuation">:</span> <span class="token number">1</span> px solid #eee <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span> active <span class="token punctuation">{</span> color <span class="token punctuation">:</span> red <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> style <span class="token operator">></span> |
In the User file as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token comment">// User.vue</span> <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> h4 <span class="token operator">></span> Hello <span class="token punctuation">,</span> This is user page <span class="token operator"><</span> <span class="token operator">/</span> h4 <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> We are Sun <span class="token operator">*</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'User'</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
Next we create a routes.js file in the js / directory with the following content:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token keyword">import</span> Home <span class="token keyword">from</span> <span class="token string">'./components/Home'</span> <span class="token keyword">import</span> User <span class="token keyword">from</span> <span class="token string">'./components/User'</span> <span class="token keyword">const</span> routes <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> path <span class="token punctuation">:</span> <span class="token string">'/'</span> <span class="token punctuation">,</span> component <span class="token punctuation">:</span> Home <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'index'</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> path <span class="token punctuation">:</span> <span class="token string">'/users'</span> <span class="token punctuation">,</span> component <span class="token punctuation">:</span> User <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token string">'user'</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> routes <span class="token punctuation">;</span> |
Here:
path
: is the path displayed in the address bar,
component
: is the component that will be rendered into the layout
name
: used to identify the route, so we can use it more conveniently.
There are also many other attributes, you can refer to the document link https://router.vuejs.org/guide/essentials/named-routes.html
Next in the file js / app.js will modify the following to import vue-router and declare use:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <span class="token comment">//app.js</span> <span class="token comment">// khai báo các component</span> Vue <span class="token punctuation">.</span> <span class="token function">component</span> <span class="token punctuation">(</span> <span class="token string">'home'</span> <span class="token punctuation">,</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'./components/Home'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Vue <span class="token punctuation">.</span> <span class="token function">component</span> <span class="token punctuation">(</span> <span class="token string">'user'</span> <span class="token punctuation">,</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'./components/User'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Vue <span class="token punctuation">.</span> <span class="token function">component</span> <span class="token punctuation">(</span> <span class="token string">'app'</span> <span class="token punctuation">,</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'./components/App'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// import vue router, component và routes</span> <span class="token keyword">import</span> App <span class="token keyword">from</span> <span class="token string">'./components/App'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> Vue <span class="token keyword">from</span> <span class="token string">'vue'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> VueRouter <span class="token keyword">from</span> <span class="token string">'vue-router'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> routes <span class="token keyword">from</span> <span class="token string">'./routes'</span> <span class="token punctuation">;</span> <span class="token comment">// use router</span> Vue <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> VueRouter <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// khai báo dùng router này</span> <span class="token keyword">const</span> router <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">VueRouter</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> routes <span class="token punctuation">,</span> mode <span class="token punctuation">:</span> <span class="token string">'history'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// và cuối cùng là tạo 1 instance Vue và render tại phần tử có id là app,</span> <span class="token comment">// render tại component App và dùng router đã khai báo ở trên</span> <span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vue</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> el <span class="token punctuation">:</span> <span class="token string">'#app'</span> <span class="token punctuation">,</span> render <span class="token punctuation">:</span> h <span class="token operator">=></span> <span class="token function">h</span> <span class="token punctuation">(</span> App <span class="token punctuation">)</span> <span class="token punctuation">,</span> router <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
The above has the following:
1 2 3 4 5 | <span class="token keyword">const</span> router <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">VueRouter</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> routes <span class="token punctuation">,</span> mode <span class="token punctuation">:</span> <span class="token string">'history'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
There is a mode: ‘history’ that works as follows: Without this mode, by default when entering the path, we will have a #
in the browser.
For example: localhost / # / user Ok, see if npm has finished building, then go outside to load your browser to see the home view and load the contents of the App.vue component:
And the final step in the App.vue file is amended as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"container"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"header"</span> <span class="token operator">></span> <span class="token operator"><</span> ul <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav justify-content-center"</span> <span class="token operator">></span> <span class="token operator"><</span> li <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav-item"</span> <span class="token operator">></span> <span class="token operator"><</span> router <span class="token operator">-</span> link <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav-link"</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"[{active: $route.name === 'index'}]"</span> <span class="token punctuation">:</span> to <span class="token operator">=</span> <span class="token string">"{name: 'index'}"</span> <span class="token operator">></span> Home <span class="token operator"><</span> <span class="token operator">/</span> router <span class="token operator">-</span> link <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> li <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav-item"</span> <span class="token operator">></span> <span class="token operator"><</span> router <span class="token operator">-</span> link <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav-link"</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"[{active: $route.name === 'user'}]"</span> <span class="token punctuation">:</span> to <span class="token operator">=</span> <span class="token string">"{name: 'user'}"</span> <span class="token operator">></span> User <span class="token operator"><</span> <span class="token operator">/</span> router <span class="token operator">-</span> link <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> li <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> ul <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"main mt-4"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"row"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"col-md-8 offset-2 text-center"</span> <span class="token operator">></span> <span class="token operator"><</span> router <span class="token operator">-</span> view <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> router <span class="token operator">-</span> view <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'App'</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
We need to pay attention to the following 2 places:
1 2 3 4 5 6 7 8 9 10 | <span class="token operator"><</span> router <span class="token operator">-</span> link <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"nav-link"</span> <span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"[{active: $route.name === 'index'}]"</span> <span class="token punctuation">:</span> to <span class="token operator">=</span> <span class="token string">"{name: 'index'}"</span> <span class="token operator">></span> Home <span class="token operator"><</span> <span class="token operator">/</span> router <span class="token operator">-</span> link <span class="token operator">></span> <span class="token comment">// Đây là 1 route điều hướng chúng ta đến route có name là index</span> <span class="token comment">// và sẽ thêm class là active nếu route name là index</span> |
Next is:
1 2 3 | <span class="token operator"><</span> router <span class="token operator">-</span> view <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> router <span class="token operator">-</span> view <span class="token operator">></span> <span class="token comment">// Chỗ này được hiểu là với mỗi route sẽ được load các component đã được khai báo trong file routes.js</span> |
Go outside to test again: Very simple, right.