Vue Study [2]: Vue Router
Description
The article for vue router.
Original post link:https://www.cnblogs.com/markjiang7m2/p/10796020.html
Source code:https://gitee.com/Sevenm2/Vue.Web/tree/master/Vue.Router
Start
Actually we should only remember 3 points for vue router.
<router-link>
. For user to click.<router-view>
. To show the related content.- router index.js. Declare which content will be show when user click a link.
<router-link>
& <router-view>
is a pair of tags for vue router. They are always used together.
router-link
<router-link>
will be compiled into <a>
when we build the project.
There is an important property to
in <router-link>
. It will tell the website which path will be redirected to when user click this link.
Html in App.vue
<ul>
<li><router-link to="/" >Home</router-link></li>
<li><router-link to="/food" >Food</router-link></li>
<li><router-link to="/rating">Rating</router-link></li>
<li><router-link to="/seller">Seller</router-link></li>
</ul>
It shows that when user click the Home
link, the website will redirect to path /
, and Food
link for path /food
, the same as Rating
, Seller
.
Actually it will be compiled as below.
<ul>
<li><a href="#/" >Home</a></li>
<li><a href="#/food" >Food</a></li>
<li><a href="#/rating">Rating</a></li>
<li><a href="#/seller">Seller</a></li>
</ul>
router-view
When website redirect to a path, such as /food
, we may want to show something different in somewhere in the page. So we should add the <router-view>
tag to the place which we want to show the related content.
Html in App.vue
<ul>
<li><router-link to="/" >Home</router-link></li>
<li><router-link to="/food" >Food</router-link></li>
<li><router-link to="/rating">Rating</router-link></li>
<li><router-link to="/seller">Seller</router-link></li>
</ul>
<router-view></router-view>
So if the related content is <div>Food content</div>
, it will show in html as below.
<ul>
<li><a href="#/" >Home</a></li>
<li><a href="#/food" >Food</a></li>
<li><a href="#/rating">Rating</a></li>
<li><a href="#/seller">Seller</a></li>
</ul>
<div>Food content</div>
router index.js
As above, we say that <router-view>
tag will be replaced by the related content, but what is the related content?
The route rule will be declared in the router index.js file. We can find this file in the path src\router\index.js
as below.
In the index.js file, I have declared the rule.
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/food',
component: { template: '<div>Food content</div>' }
},
{
path: '/seller',
component: { template: '<div>Seller content</div>' }
},
{
path: '/rating',
component: { template: '<div>Rating content</div>' }
}
]
})
As above, path /food
related content is <div>Food content</div>
.
The result will be shown as below.
Path /
We can see that the tag <router-view>
is replaced as empty currently.
Path /food
We can see that the tag <router-view>
is replaced by <div>Food content</div>
currently.
In our actual development, we always have a lot of content to show in the tag <router-view>
, so vue support to declare an individual component.
food.vue
<template>
<div class="content">
<div>Food content</div>
<!-- more other contents -->
</div>
</template>
<script>
export default {
name: 'food',
data () {
return {
msg: 'food'
}
}
}
</script>
And then we can import these components in router index.js
import Vue from 'vue'
import Router from 'vue-router'
import food from '@/components/food'
import seller from '@/components/seller'
import rating from '@/components/rating'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/food',
component: food
},
{
path: '/seller',
component: seller
},
{
path: '/rating',
component: rating
}
]
})
Dynamic Route Matching
Based on the above 3 route points, we can do some more extensions.
If our different paths are based on a parameter, such as an id, we can use a colon :
to declare just one route in the index.js
import Vue from 'vue'
import Router from 'vue-router'
import food from '@/components/food'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/:id',
name: 'food',
component: food
}
]
})
And in the component, we can use this.$route.params
to get the parameter's value.
<template>
<div class="content">
<div>{{$route.params.id}} content</div>
</div>
</template>
<script>
export default {
name: 'food',
data () {
return {
msg: this.$route.params.id
}
}
}
</script>
Nested Routes
Sometimes, we may want to show some differences with different path based on food component. Then we should use the nested routes.
Firstly, I add a subfood component with a parameter.
<template>
<div class="subcontent">
<div>Sub Food content</div>
<div>{{$route.params.id}}</div>
</div>
</template>
<script>
export default {
name: 'subfood',
data () {
return {
msg: 'subfood'
}
}
}
</script>
Secondly, we add links in food component, so that we can visit the subfood component.
<div>Food content</div>
<div class="subnavbar">
<ul>
<li><router-link to="/food/subfood1">SubFood1</router-link></li>
<li><router-link to="/food/subfood2">SubFood2</router-link></li>
<li><router-link to="/food/subfood3">SubFood3</router-link></li>
</ul>
<router-view></router-view>
</div>
And in the router index.js, we should a children property in /food
section.
{
path: '/food',
component: food,
children:[
{
path: '/food/:id',
component: subfood
}
]
}
The result is as below.
In this case, maybe some of you will think that as the subfood path includ /food
, so its content will show in food component's <router-view>
.
However, all results are because of the router index.js declaration. We can make an example as below.
Delcare the subfood path in root.
{
path: '/food',
name: 'food',
component: food
},
{
path: '/seller',
name: 'seller',
component: seller
},
{
path: '/rating',
name: 'rating',
component: rating
},
{
path: '/food/:id',
name: 'subfood',
component: subfood
}
We can see that the subfood component is shown in the root's <router-view>
.
The sub component will be shown in its parent component's <router-view>
. If the component path is declared in root, it will be shown in the root's <router-view>
Named Routes
We can add a name property in router index.js.
{
path: '/food',
name: 'food',
component: food,
children:[
{
path: '/food/:id',
name: 'subfood',
component: subfood
}
]
}
Then we can use the named routes in <router-link>
. Remember, we should a colon :
before to
property.
The below syntax are the same result.
<li><router-link :to="{name: 'food'}" >Food</router-link></li>
<li><router-link to="/food" >Food</router-link></li>
If there is an parameter in the path.
<li><router-link :to="{ name: 'food', params: { id: subfood1 }}" >Food</router-link></li>
Named Views
Sometimes we need to show multiple contents in the same time. Then we should add a name property for different </router-view>
.
Firstly, I add a subextend component.
<template>
<div class="subcontent">
<div>Sub Extend content</div>
<div>{{$route.params.id}}</div>
</div>
</template>
<script>
export default {
name: 'subextend',
data () {
return {
msg: 'subextend'
}
}
}
</script>
Secondly, add a </router-view>
in food component.
<div class="subnavbar">
<ul>
<li><router-link to="/food/subfood1">SubFood1</router-link></li>
<li><router-link to="/food/subfood2">SubFood2</router-link></li>
<li><router-link to="/food/subfood3">SubFood3</router-link></li>
</ul>
<router-view></router-view>
<router-view name="ex"></router-view>
</div>
The next is router index.js. As there are multiple components, we should use property components, pls. noted the s.
The default component will be shown in </router-view>
without name property and the ex component will be shown in </router-view>
with name property value as "ex".
{
path: '/food',
name: 'food',
component: food,
children:[
{
path: '/food/:id',
name: 'subfood',
components: {
default: subfood,
ex: subextend
}
}
]
}
The result is as below.
Redirect in js
Sometimes we should do some logic judgement in js and then we could determine which path we could redirect to. We can use this.$router.push()
to do this in js.
this.$router.push({ name: 'food', params: { id: "subfood1" }});
this.$router.push("/food/subfood1");
404 Error Page
When user want to access a Url which is not nonexistent, then we should redirect to a 404 page.
First, we add a 404 component.
<template>
<div class="content">
<div>404 Error</div>
</div>
</template>
<script>
export default {
name: 'error404',
data () {
return {
msg: '404'
}
}
}
</script>
Then add the route in router index.js. As we should catch all unknown Url, we should declare the route in root.
export default new Router({
routes: [
{
path: '*',
name: 'error404',
component: error404
},
{
path: '/food',
name: 'food',
component: food
}
...
]
})
Then we run the application and have a look.
We will find that when we access the root path, we get a 404 view. It is not the result we want.
It is because we donot declare the root view in router index.js. Let me to add it.
I add a home component and then declare it as the root view.
export default new Router({
routes: [
{
path: '*',
name: 'error404',
component: error404
},
{
path: '/',
name: 'home',
component: home
},
{
path: '/food',
name: 'food',
component: food
}
...
]
})
Then have a look.
It shows correctly now. When we access an unknown Url, the website will show the 404 view.
Maybe someone will say why the page will still show the menu in top. We should know that the elements in App.vue will always be shown. If we just want to show 404 view when we access an unknown page, we should move the menu elements into home component, and declare the menu components as children in home path.
home.vue
<template>
<div class="content">
<header>
<nav class='navbar'>
<ul>
<li><router-link to="/" >Home</router-link></li>
<li><router-link to="/food" >Food</router-link></li>
<li><router-link to="/rating">Rating</router-link></li>
<li><router-link to="/seller">Seller</router-link></li>
</ul>
<router-view></router-view>
</nav>
</header>
</div>
</template>
<script>
export default {
name: 'home',
data () {
return {
msg: 'home'
}
}
}
</script>
router index.js
{
path: '/',
name: 'home',
component: home,
children:[
{
path: '/food',
name: 'food',
component: food,
children:[
{
path: '/food/:id',
name: 'subfood',
components: {
default: subfood,
ex: subextend
}
}
]
},
...
]
}
Then the website will only show 404 view when we access an unknown Url.
Alias
As above, when we access the root path, it shows nothing in the RouterView. Actually sometimes we should show something, such as dashboard in the root path. How can we do this?
There is a property Alias
in router. More uage description can be found in Vue.
Here we could only focus on the definition.
An alias of /a
as /b
means when the user visits /b
, the URL remains /b
, but it will be matched as if the user is visiting /a
.
We know that a path begin with /
means an absolute path, without /
means a relative path. So we can declare a child in home view and set alias
as ''
or /
. It means when we access /
, we are actually accessing /food
.
{
path: '/',
name: 'home',
component: home,
children:[
{
path: '/food',
name: 'food',
alias: '/',
component: food,
children:[
{
path: '/food/:id',
name: 'subfood',
components: {
default: subfood,
ex: subextend
}
}
]
},
...
]
}
HTML5 History Mode
Maybe you have found that all our Urls are including #
. It's not a good link with #
. Is there any way to remove this char? Sure. The HTML5 History Mode will help us. More uage description can be found in Vue.
We can set mode value as history
in router index.js and then run the application. We can get a Url without #
.
export default new Router({
mode: 'history',
routes: [
...
]
})
Build Setup command line
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
# run unit tests
npm run unit
# run e2e tests
npm run e2e
# run all tests
npm test
Vue Study [2]: Vue Router的更多相关文章
- Vue Study [1]: Vue Setup
Description The article for vue.js Setup. Original post link:https://www.cnblogs.com/markjiang7m2/p/ ...
- Vue 2.0 + Vue Router + Vuex
用 Vue.js 2.x 与相配套的 Vue Router.Vuex 搭建了一个最基本的后台管理系统的骨架. 当然先要安装 node.js(包括了 npm).vue-cli 项目结构如图所示: ass ...
- vue教程3-05 vue组件数据传递、父子组件数据获取,slot,router路由
vue教程3-05 vue组件数据传递 一.vue默认情况下,子组件也没法访问父组件数据 <!DOCTYPE html> <html lang="en"> ...
- Vue04——vue自定义事件、Router、Vue-cli、发布上线
一.Vue的自定义事件 点击任何一个按钮,按钮本身计数累加,但是每点击三个按钮中的一个,totalCounter 都要累加. <body> <div id="app&quo ...
- vue & this.$route & this.$router
vue & this.\(route & this.\)router const User = { template: '<div>User</div>' } ...
- Vue学习笔记-Vue.js-2.X 学习(七)===>脚手架Vue-CLI(路由Router)
脚手架Vue-CLI(路由Router) 一 按装(通过新创建脚手架按装),如果在原来的脚手架上按装直接进图型化界面vue ui的插件按装. 二 使用(上面按装下面步骤自动会生成) 第一步:导入路由对 ...
- 浅谈 vue实例 和 vue组件
vue实例: import Vue from 'vue'; import app from './app'; import myRouter from './routers'; new Vue({ e ...
- 【实战】Vue全家桶(vue + axios + vue-router + vuex)搭建移动端H5项目
使用Vue全家桶开发移动端页面. 本博文默认已安装node.js. github链接 一.准备工作 安装vue npm install vue 安装脚手架vue-cli npm install -g ...
- js 引入Vue.js实现vue效果
拆分组件为单个js见:https://www.jianshu.com/p/2f0335818ceb 效果 html <!DOCTYPE html> <html> <hea ...
随机推荐
- Linux查看物理CPU个数、核数,逻辑CPU个数
学习swoole的时候,建议开启的worker进程数为cpu核数的1-4倍.于是就学习怎么查看CPU核数 # 查看物理CPU个数 cat /proc/cpuinfo| grep "physi ...
- PHP Warning: Module 'modulename' already loaded in Unknown on line 0 的解决方法
今天无间断服务加载php-fpm时,爆出了一个错误:PHP Warning: Module 'xhprof' already loaded in Unknown on line 0 <br / ...
- .netcore 在linux 上运行 Helllo World 例子
要想在linux上运行netcore ,需要在linux 安装netcore SKD 下面分两步完成, 首先我的操作系统是 Ubuntu 14.04 ,不同版本可以参考 官网给出的连接 https:/ ...
- redis学习三 redis持久化
1,快照持久化 1简介 redis可以通过创建快照来获得某个时间点上的内存内容的数据副本,有了副本之后,就可以将副本发送到其他redis服务器上从而创建相同数据的从服务器,同时快照留在原 ...
- Win7无法访问Windows共享文件夹
解决方法如下 On the Windows 7 machine: Run secpol.msc Drill down through Local Policies | Security Options ...
- 冷扑大师AI简史:你用德扑来游戏,人家用来发Science
前言 人类又输了...... 创新工场组织的一场“人工智能和顶尖牌手巅峰表演赛中”,机器人AI冷扑大师赢了人类代表队龙之队 792327 记分牌,最后 200 万奖励归机器人所有. 在围棋项目上人类的 ...
- 问题:oracle 两个表之间的修改;结果:ORACLE 两个表之间更新的实现
前提条件: 表info_user中有字段id和name,字段id为索引 表data_user_info中有字段id和name,字段id为索引 其中表info_user中字段id和表data_user_ ...
- windows 10微软账户不能访问局域网共享,但是本地账户可以访问
windows10有时候无法访问局域网的共享文件夹.会提示没有权限. 如果共享的文件夹已经设置为everyone,那么通常是windows 10用的是微软账户登录的. 有两个方案可以处理这种情况. 一 ...
- Group Layout
----------------siwuxie095 将根面板 contentPane 的布局切换为 Group Layout Grou ...
- Win 7系统优化/设置小工具 (脚本)
Win7系统优化脚本 用了多年win7,用的过程中,发现了一些问题,关于系统基本的优化,和个人的使用习惯设置等等,做成了一个脚本,可以一键设置win7的系统设置,比如更新提醒,关闭防火墙提示,烦人的系 ...