vue项⽬创建步骤及路由router
1、创建⼀个vue项⽬步骤(windows环境下)。创建vue项⽬前,检查系统是否具备创建项⽬的条件(是否已经安装好了node.js、webpack、vue-cli)。cmd打开终端。
1.1 如果还没安装node.js,则先安装,安装完成后,查看node版本
node -v
1.2 安装淘宝镜像,安装完成后查看npm版本:npm -v
1.3 安装webpack
npm install webpack -g
1.4 安装vue全局脚⼿架,vue-cli
2.x使⽤  npm install -g vue-cli  , vue-cli
3.x使⽤  npm install -g @vue/cli  安装,查看vue版本: vue -V
npm install -g vue-cli
  或
npm install -g @vue/cli
1.5 准备⼯作做好了,开始正式创建vue项⽬,创建vue项⽬可以选择两种⽅式。下⾯的my_vue_pro是vue项⽬名字
vue init webpack my_vue_pro
  或
vue create my_vue_pro
  vue init  是vue-cli2.x的初始化⽅式,可以使⽤github上⾯的⼀些模板来初始化项⽬,webpack是官⽅推荐的标准模板名。vue-cli2.x项⽬向3.x迁移只需要把static⽬录复制到public⽬录下,⽼项⽬的src⽬录覆盖3.x的src⽬录。 vue  create  是vue-
cli3.x的初始化⽅式,⽬前模板是固定的,模板选项可⾃由配置,创建出来的是vue-cli3的项⽬,与vue-cli2项⽬结构不同,配置⽅法不同,具体配置⽅法参考。
  如果vue版本还是2.x, 从vue-cli2.x升级到最新版:先执⾏卸载: npm uninstall -g vue-cli  ,再安装最新版  npm install -g @vue/cli
1.6  cd进⼊项⽬
cd my_vue_pro
1.7 添加需要的依赖包,⽐如添加vue路由vue-router依赖包,可以使⽤  npm install vue-router  , 或者  vue add router
npm install vue-router
  或
vue add router
1.8 安装所有依赖包, npm install  。卸载依赖包: npm uninstall xxx
cnpm install
1.9 运⾏项⽬,查看package.json⽂件中的scripts脚本中的运⾏⽅式, npm run dev  或  npm  run serve
npm run serve
2、vue路由vue-router解说
  Vue Router 是官⽅的路由管理器。它和 Vue.js 的核⼼深度集成,让构建单页⾯应⽤变得易如反掌。包含的功能有:
嵌套的路由/视图表
模块化的、基于组件的路由配置
路由参数、查询、通配符
基于 Vue.js 过渡系统的视图过渡效果
细粒度的导航控制
带有⾃动激活的 CSS class 的链接
HTML5 历史模式或 hash 模式,在 IE9 中⾃动降级
⾃定义的滚动条⾏为
为了加深对路由的理解,在安装vue-router包后,如果项⽬⾃动⽣成了router.js,先删除,我们⼿动来写⼀个router.js。创建router.js后,再新增加2个vue页⾯,命名pageA和pageB,如下图:
其中router.js代码
import Vue from 'vue'
import Router from 'vue-router'
//⾃定义页⾯
import PageA from './views/PageA'
import PageB from './views/PageB'
//安装路由到vue
Vue.use(Router)
const routes = [
{
path: '/',
redirect: '/pageB' //重定向,设置默认进⼊pageB页⾯
}, {
//动态路径参数,以冒号开头,如果有多个参数则继续往后⾯追加
resolve a doi namepath: '/pageA/:id/:name',
name: 'pageA',
component: PageA
}, {
path: '/pageB',
name: 'pageB',
component: PageB
}
]
export default new Router({
//mode: 'hash', //默认hash模式,hash模式有#;另外还有⼀种history模式,没有#符号
routes
})
main.js是vue项⽬的⼊⼝脚本,在这⾥引⼊router.js, 传⼊路由配置。
import Vue from 'vue'
import App from './App.vue'
import router from './router.js'
new Vue({
router, //key名字必须命名为router
render: h => h(App)
}).$mount('#app')
2.1 路由视图<router-view> 组件和路由导航<router-link>组件
 在项⽬启动模板页App.vue上⾯有个<router-view>路由视图组件,相当于是⼀个占位符⼀样(<slot>插槽也类似),之后页⾯的路由变化引起的页⾯替换都是在<router-view>路由视图上进⾏。
  ⽽<router-link>有点类似于超链接标签<a>,<router-link>上有个必写的属性to, 就类似于超链接<a>的href属性,设置要跳转的路由链接。
  App.Vue测试代码:
<template>
<div id="app">
<div id="nav">
<router-link to="/pageA/5188/王⼤锤">pageA</router-link> |
<router-link to="/pageB">pageB</router-link>
</div>
<router-view/>
</div>
</template>
2.2 路径参数和查询参数
  路径参数和查询参数作为页⾯之间的数据传递的⼀种⽅式,使⽤⾮常频繁。路径参数,望⽂⽣义意思是参数作为路径的⼀部分,在配置路由的时候把参数配置好,然后在浏览器中输⼊url时,必须传参,否则会不到这个路由这个页⾯。例
如,pageA页⾯的路由配置为:/pageA/:id/:name  ,意思是pageA页⾯后⾯必须传⼀个id参数和name参
数,这两个参数作为路径的⼀部分,必须传值。然后在pageA页⾯中⽤:this.$route.params 来获取所有的路径参数。
  ⽽查询参数则没有路径参数这么严格,路由不会对此做验证。路由参数在url中的表现为页⾯链接后⾯加 ?key=value&...,然后在页⾯中⽤:this.$route.query 来获取所有查询参数。如下图:
我们打印this.$route变量,看到如上图右边部分内容:
this.$route.name : 页⾯名字。这个name就是在router.js中配置的那个name, 这个name也是有⼤⽤处的,⽐如在<router-link>中使⽤“命名路由”的时候就是⽤到它,举例说明,通过在路由链接标签的to属性设置name和相应的参数,然后跳转效果和设置路由path是⼀样的:
<router-link :to="{ name: 'pageA', params: { id: 5188, name:'王⼤锤' }}">命名路由pageA</router-link>
this.$route.path: 路由路径,包含路径参数,不包含查询参数
this.$route.fullPath:路由全路径,包含路径参数和查询参数
this.$route.query: 路径所有查询参数
this.$route.params: 路径所有路径参数
this.$a: 路由元信息,在配置路由的时候可以把⾃定义的⼀些数据存在meta中,⽤作其他⽤途
this.$route.matched: ⾥⾯包含了路由的⼀些匹配信息
2.3 路由props设置及路径参数获取
  在设置页⾯路由时,如果增加⼀个props属性,并设置为true, 则在页⾯中可以直接拿到参数,不需要通过
this.$route.params来取参数。⽐如router.js中部分代码:
{
path: '/pageC/:id/:name',
name: 'pageC',
props: true, //设置props属性为true, 则可以在PageC页⾯中直接取参数
component: PageC
}
在PageC页⾯中参数获取:
<template>
<div class="box">
<h1>佛⼭ -- 黄飞鸿,from PageC </h1>
<h3>男⼉何不带吴钩,收取关⼭五⼗州</h3>
<h3>路径参数id: {{this.id}}, name: {{this.name}}</h3>
</div>
</template>
<script>
export default {
name: 'pageC',
props: ['id', 'name'], //直接接收路径参数
created(){
console.log("id: ", this.id, ", name: ", this.name)
}
}
</script>
2.4 嵌套路由。实际⽣活中的应⽤界⾯,通常由多层嵌套的组件组合⽽成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件。⽐如现在PageB页⾯中嵌⼊页⾯PageC, 则需要在PageB页⾯中增加⼀个路由视图<router-view>标签,作为嵌套页⾯PageC的占位符。
  路由部分代码:
{
path: '/pageB',
name: 'pageB',
component: PageB,
meta: { isOK: true, type: 9 },
children: [
{
path: 'pageC/:id/:name',
component: PageC,
props: true, //设置props属性为true, 则可以在PageC页⾯中直接取参数
name: 'subPageC',
meta: { requiresAuth: true, id: 51666 }, //⾃定义数据
}
]
},
 PageB页⾯中部分代码:
<template>
<div class="box">
<h1>⼀⽚云 -- 罗⼩虎,from PageB </h1>
<h3>千磨万击还坚劲,任尔东南西北风</h3>
<!-- 嵌套路由,嵌套页⾯占位符 -->
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'pageB',
created(){
console.log('...')
console.log(this.$route)
}
}
</script>
  效果图:
2.5 编程式的导航。 <router-link>叫声明式导航,还有种编程式导航,格式为:router.push(location, onComplete?, onAbort?), 在页⾯中的使⽤例⼦:
// 字符串
router.push('home')
// 对象
router.push({ path: 'home' })
// 命名的路由
router.push({ name: 'user', params: { userId: '123' }})
// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
/*注意:如果提供了 path,params 会被忽略,上述例⼦中的 query 并不属于这种情况。
取⽽代之的是下⾯例⼦的做法,你需要提供路由的 name 或⼿写完整的带有参数的 path:
*/
const userId = '123'
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这⾥的 params 不⽣效, 即编程式导航如果提供了path, 则路径参数必须写⼊path中。⽽查询参数可以不写⼊
router.push({ path: '/user', params: { userId }}) // -> /user
  同样的编程式导航规则也适⽤于<router-link>导航组件的to属性
  place(location, onComplete?, onAbort?) 和router.push(...)很像,唯⼀的不同就是,它不会向 history 添加新记录,⽽是跟它的⽅法名⼀样 —— 替换掉当前的 history 记录。声明式导航替换⽤法: <router-link :to="..." replace>  ,编程式导航替换⽤法:  place(...)
<(n)的使⽤,这个⽅法的参数是⼀个整数,意思是在 history 记录中向前或者后退多少步,类似
(n)。
// 在浏览器记录中前进⼀步,等同于 history.forward()
<(1)
// 后退⼀步记录,等同于 history.back()
<(-1)
// 前进 3 步记录
<(3)
// 如果 history 记录不够⽤,那就默默地失败呗
<(-100)
<(100)
2.6 命名视图。有时候想同时 (同级) 展⽰多个视图,⽽不是嵌套展⽰,例如创建⼀个布局,有 sidebar (侧导航) 和 main (主内容) 两个视图,这个时候命名视图就派上⽤场了。你可以在界⾯中拥有多个单独命名的视图,⽽不是只有⼀个单独的出⼝。如果 router-view 没有设置名字,那么默认为 default。
router.js中部分代码:
{
path: '/pageD',
name: 'pageD',
components: { //演⽰命名视图
default: PageD,
tanA: PageA,
tanB: PageB
}
}
App.vue中部分代码:
<router-view/>
<!-- 命名视图, 路由视图名字匹配了,就会展⽰匹配的页⾯内容 -->
<router-view name="tanA"/>
<router-view name="tanB"/>
2.7 路由模式。默认路由模式是hash模式,即地址栏中域名后带有#符号(此 hash 不是密码学⾥的散列运算)。它的特点
就是使⽤ URL 的 hash 来模拟⼀个完整的 URL,于是当 URL 改变时,页⾯不会重新加载。不过看起来不是很美观,另外hash模式的路由,在作为回调地址和⼀些第三⽅公司合作时,会有点⿇烦,⽐如如果想实现快捷登录或者获取⽤户授权时,当⽤户授权成功后,回跳回来时,返回的code参数会插⼊到#符号前⾯,这样的话就为了获取这个code,就需要⼀系列的另外操作了。
  路由模式还有另外⼀种模式就是history模式,这种模式是没有#符号的,符合我们平常的使⽤习惯。这种模式充分利⽤history.pushState API 来完成 URL 跳转⽽⽆须重新加载页⾯。
export default new Router({
//mode: 'hash', //默认hash模式,hash模式有#;另外还有⼀种history模式,没有#符号
mode: 'history', //history模式,没有#符号
routes
})
  所以呢,你要在服务端增加⼀个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同⼀个index.html 页⾯,这个页⾯就是你 app 依赖的页⾯。
3、路由导航守卫。
“导航”表⽰路由正在发⽣改变,vue-router提供的导航守卫主要⽤来通过跳转或取消的⽅式守卫导航,从⽽达到控制导航⾛向。有多种机会植⼊路由导航过程中:全局的,单个路由独享的,或者组件级的。
3.1 全局前置守卫: router.beforeEach
import router from './router.js'
//全局守卫
//beforeEach,全局前置守卫,当⼀个导航触发时,全局前置守卫按照创建顺序调⽤。
router.beforeEach((to, from, next)=>{
console.log("....")