自己看vue文档,难免有些地方不懂,自己整理一下,主要是vue-router具体实现的操作步骤。

安装

直接下载/CDN

https://unpkg.com/vue-router/dist/vue-router.js

Unpkg.com 提供了基于 NPM 的 CDN 链接。上面的链接会一直指向在 NPM 发布的最新版本。你也可以像 https://unpkg.com/vue-router@2.0.0/dist/vue-router.js 这样指定 版本号 或者 Tag。

在 Vue 后面加载 vue-router,它会自动安装的:

  1. <script src="/path/to/vue.js"></script>
  2. <script src="/path/to/vue-router.js"></script>

NPM

  1. npm install vue-router

如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能:

  1. import Vue from 'vue'
  2. import VueRouter from 'vue-router'
  3. Vue.use(VueRouter)

如果使用全局的 script 标签,则无须如此(手动安装)。

#基础

开始

HTML:

  1. <script src="https://unpkg.com/vue/dist/vue.js"></script>
  2. <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  3. <div id="app">
  4. <h1>Hello App!</h1>
  5. <p>
  6. <!-- 使用 router-link 组件来导航. -->
  7. <!-- 通过传入 `to` 属性指定链接. -->
  8. <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
  9. <router-link to="/foo">Go to Foo</router-link>
  10. <router-link to="/bar">Go to Bar</router-link>
  11. </p>
  12. <!-- 路由出口 -->
  13. <!-- 路由匹配到的组件将渲染在这里 -->
  14. <router-view></router-view>
  15. </div>

<router-view>显示的当前路由的内容

<router-link to="/foo">实现路由的跳转

JavaScript:

  1. // 0. 如果使用模块化机制编程,導入Vue和VueRouter,要调用 Vue.use(VueRouter)
  2. // 1. 定义(路由)组件。
  3. // 可以从其他文件 import 进来
  4. const Foo = { template: '<div>foo</div>' }
  5. const Bar = { template: '<div>bar</div>' }
  6. // 2. 定义路由
  7. // 每个路由应该映射一个组件。 其中"component" 可以是
  8. // 通过 Vue.extend() 创建的组件构造器,
  9. // 或者,只是一个组件配置对象。
  10. // 我们晚点再讨论嵌套路由。
  11. const routes = [
  12. { path: '/foo', component: Foo },
  13. { path: '/bar', component: Bar }
  14. ]
  15. // 3. 创建 router 实例,然后传 `routes` 配置
  16. // 你还可以传别的配置参数, 不过先这么简单着吧。
  17. const router = new VueRouter({
  18. routes // (缩写)相当于 routes: routes
  19. })
  20. // 4. 创建和挂载根实例。
  21. // 记得要通过 router 配置参数注入路由,
  22. // 从而让整个应用都有路由功能
  23. const app = new Vue({
  24. router
  25. }).$mount('#app')
  26. // 现在,应用已经启动了!

当 <router-link> 对应的路由匹配成功,将自动设置 class 属性值 .router-link-active

步骤:

1.在main.js中引入vue-router

  1. import Vue from 'vue'
  2. import VueRouter from 'vue-router'

2.在main.js中使用这个router插件

  1. Vue.use(VueRouter)

3.生成这个router实例

  1. export default new Router(){
  2. routes:[
  3. {
  4. path:'/',
  5. name:'home',
  6. component:Home
  7. },{
  8. path:'/list',
  9. name:'list',
  10. component:List
  11. }
  12. ]
  13. }

4.在index.js中把路由实例传递给Vue根组件

  1. import router from './router'
  2. new Vue({
  3. el:'#app',
  4. router,
  5. template:'<APP/>',
  6. components:{ APP }
  7. })

静态路由

静态配置的 ---> import ....

固定路径路由的配置

  1. {
  2. path:'/',
  3. name:'home',
  4. component:Home
  5. },{
  6. path:'/list',
  7. name:'list',
  8. component:List
  9. }

动态路由匹配

只有动态路由可以做到分页的效果

//localhost:8080/#/list/2 index,js

  1. {
  2. path:'/list/:id',
  3. name:'list',
  4. component:List
  5. }

list.vue

  1. <template>
  2. <div>{{title}}</div>
  3. </template>
  4. <script>
  5. data(){
  6. return {
  7. title:""
  8. }
  9. }
  10. export default{
  11. mounted(){
  12. if(this.$route.params.id == 1){
  13. //请求第一页数据
  14. this.title="第一页"
  15. }
  16. if(this.$route.params.id == 2){
  17. //请求第二页数据
  18. this.title="第二页"
  19. }
  20. }
  21. }
  22. </script>

接收多个个参数

index.js

  1. {
  2. path:'/list/:id/name/:name',
  3. name:'list',
  4. component:List
  5. }

list.vue

  1. <template>
  2. <div>{{title}}{{name}}</div>
  3. </template>
  4. <script>
  5. data(){
  6. return {
  7. title:"",
  8. name:""
  9. }
  10. }
  11. export default{
  12. mounted(){
  13. //结构赋值写法
  14. const {name,id} = this.$route.params;
  15. this.name = name;
  16. //this.name = this.$route.params.name;
  17. if(this.$route.params.id == 1){
  18. //请求第一页数据
  19. this.title="第一页"
  20. }
  21. if(this.$route.params.id == 2){
  22. //请求第二页数据
  23. this.title="第二页"
  24. }
  25. }
  26. }
  27. </script>

传递不同参数 显示不同数据

项目应用:详情页

watch 响应路由参数的变化

监听路由的变化

  1. watch:{
  2. '$route'(to,from){
  3. this.name = to.params.name;
  4. }
  5. }

在2.2中引入守卫( beforeRouteUpdate)

守卫 --> 钩子函数

  1. beforeRouteUpdate (to, from, next) {
  2. this.name = to.params.name;
  3. next();//走到下一个钩子
  4. }

嵌套路由

头部左侧不变只有内容区改变 这样的需求可以用嵌套路由来做

  1. {
  2. path:'/list',
  3. name:'list',
  4. component:List,
  5. childeren:[{
  6. path:'a',
  7. component:A
  8. }]
  9. }

再引入一个A组件 A.vue

在list.vue组件中通过,<router-view>显示A组件的内容

在一个非app组件里面写<router-view>显示的是当前路由下子组件的内容

编程式的导航

除了<router-link>来创建a标签来定义导航链接,还可以借助router的实例方法

  1. router.push(location,onCompelte?,onAbort?)

在Vue实例内部,可以通过$route访问路由实例,因此你可以调用this.$route.push

想要导航到不同的URL,则使用router.push方法。这个方法会向history栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的URL。

当你点击<route-link>时,这个方法会在内部调用,所以说,

点击<route-link:to="..."> ---> 声明式

等同于

调用router.push(...) ---> 编程式

可以在Header组件中跳转到list中

  1. export defalut{
  2. methods:{
  3. handleClick(){
  4. this.$router.push({
  5. name:'list'
  6. })
  7. }
  8. }
  9. }

可以在Header组件中跳转到list/123中

  1. export defalut{
  2. methods:{
  3. handleClick(){
  4. this.$router.push({
  5. //一种方式
  6. //path:'/list/123',
  7. //2种方式
  8. name:'list'
  9. params:{
  10. id:123
  11. }
  12. })
  13. }
  14. }
  15. }

使用router.push 或者 router.replace 里面都不能让path和params同时存在

  1. //字符串
  2. router.push('home');
  3. //对象
  4. router.push({path:'home'})
  5. //命名的路由
  6. router.push({name:'user',params:{userId:123}})
  7. //带查询参数,变成/register?plan=private
  8. router.push({path:'register',query:{plan:'private'}})

router.replace

和router.push唯一的不同就是,不会向history添加新纪录,而是替换掉当前的history记录 不能返回

router.go

命名路由

定义名字跳转

命名视图

  1. <router-view></router-view>
  2. <router-view name="a"></router-view>
  3. <router-view name="b"></router-view>
  4. var app = new VueRouter({
  5. routers:[{
  6. path:'/',
  7. componens:{
  8. defaults:Foo,
  9. a:Bar,
  10. b:Baz
  11. }
  12. }]
  13. })

重定向和别名

访问/abc 重定向到/根路径

  1. {
  2. path:'/abc',
  3. redirect:'/'
  4. }

访问/bieming 实际上还是访问的根路径

  1. {
  2. path:'/',
  3. name:'home',
  4. component:Home,
  5. alias:'/bieming'
  6. }

路由组件传参

解耦

动态路由传id

  1. {
  2. path:'/list/:id',
  3. name:'list',
  4. component:List,
  5. props:true
  6. }

在list.vue中

可以直接通过props['id']获取数据

  1. <template>
  2. <div>{{id}}</div>
  3. </template>
  4. <script>
  5. export default{
  6. props['id']
  7. }
  8. </script>

对象模式

props:{name:"dell"}

一般是写死的字符串静态数据

函数模式

index.js

  1. {
  2. path:'/list/:id',
  3. name:'list',
  4. component:List,
  5. props : (route)=>({
  6. query:route.query.q
  7. id:route.params.id
  8. })
  9. }

list.vue

  1. <template>
  2. <div>{{query}}</div>
  3. <div>{{id}}</div>
  4. </template>
  5. <script>
  6. export default{
  7. props['query','id']
  8. }
  9. </script>
  10. 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1rr2npw3kickj

vue路由详解的更多相关文章

  1. Vue 路由详解

    Vue 路由详解 对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能.但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用,所以各大框架纷纷给出了单页面应用的解决路由跳转的方案. V ...

  2. react router @4 和 vue路由 详解(八)vue路由守卫

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 13.vue路由守卫 a.beforeEach 全局守卫 (每个路由调用前都会触发,根据 ...

  3. react router @4 和 vue路由 详解(一)vue路由基础和使用

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 1.vue路由基础和使用 a.大概目录 我这里建了一个router文件夹,文件夹下有in ...

  4. react router @4 和 vue路由 详解(全)

    react router @4 和 vue路由 本文大纲: 1.vue路由基础和使用 2.react-router @4用法 3.什么是包容性路由?什么是排他性路由? 4.react路由有两个重要的属 ...

  5. react router @4 和 vue路由 详解(六)vue怎么通过路由传参?

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 8.vue怎么通过路由传参? a.通配符传参数 //在定义路由的时候 { path: ' ...

  6. react router @4 和 vue路由 详解(四)vue如何在路由里面定义一个子路由

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 6.vue如何在路由里面定义一个子路由? 给父路由加一个 children:[] 参考我 ...

  7. react router @4 和 vue路由 详解(二)react-router @4用法

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 2.react-router @4用法 a.大概目录      不需要像vue那样麻烦的 ...

  8. 07Vue.js快速入门-Vue路由详解

    对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能.但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用, 所以各大框架纷纷给出了单页面应用的解决路由跳转的方案. Vue框架的兼容性 ...

  9. react router @4 和 vue路由 详解(七)react路由守卫

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 12.react路由守卫? a.在之前的版本中,React Router 也提供了类似的 ...

随机推荐

  1. linux学习:find用法整理

    find path -option [ -print ] [ -exec -ok command ] {} \; path: find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录 ...

  2. Web应用程序架构的比较

    架构 技术优势 技术挑战 团队优势 团队挑战 单体 低延时 开发简单 没有重复的模型/验证 伸缩 由于代码库过大引起的复杂度 特性内沟通的开销低 失败的恐惧 特性间沟通的开销大 前端+后端 能够单独扩 ...

  3. idea创建的java web项目打包发布到tomcat

    File-> Project Structure... 点击Artifacts->+号 点击Web Application:Archive->选择与你的项目对应的那一项Artifac ...

  4. 使用Dubbo的SPI扩展机制实现自定义LoadBalance——方法二 不改源码添加META-INF/dubbo元数据

    一.官网提供的方法 参考官网 http://dubbo.apache.org/zh-cn/docs/dev/impls/load-balance.html 二.方法总结 在工程中创建类并实现LoadB ...

  5. WPF DataGrid分页功能实现代码

    在Silverlight中DataGrid分页可以结合DataPager控件很容易实现,但是在WPF中没有类似的,需要手动实现这样一个控件: 1.创建一个UserControl,DP.xaml,代码如 ...

  6. 自学stm32的一些个人经验

    1.首先我们先看看与STM32相关的文档 我们假定大家已经对STM32的书籍或者文档有一定的理解.如不理解,请立即阅读STM32的文档,以获取最基本的知识点. 如果你手上拥有ST官方主推的STM32神 ...

  7. OO第一次博客作业--第一单元总结

    OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...

  8. Python3学习之路~7.1 静态方法、类方法、属性方法

    静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量 ...

  9. java中使用JDBC的preparedStatement批处理数据的添加

    在项目中我们偶尔可能会遇到批量向数据库中导入数据,如果批处理的情况较多的情况下可以使用spring batch,如果只是一个导入功能的话可以考虑使用jdbc的preparedStatement处理. ...

  10. MATLAB算术运算符和常用函数

    1 算术运算符 Matlab中的算术运算符按优先级由高到低为: (1) ^           幂 (2) *            乘      /            右除(正常除)       ...