详解vue-router基本使用


Posted in Javascript onApril 18, 2017

路由,其实就是指向的意思,当我点击页面上的home  按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮  => home 内容, about按钮 => about 内容,也可以说是一种映射。 所以在页面显示中,有两个部分,一个是需要点击的部分,一个是点击之后,显示点击内容的部分。

点击之后,怎么做到正确的对应,比如,我点击home 按钮,页面中怎么才能显示home的内容。这就要在js 文件中配置路由。

路由中有三个基本的概念 route, routes, router。

1, route,它是一条路由,由这个英文单词也可以看出来,它是单数, Home按钮  => home内容, 这是一条route,  about按钮 => about 内容, 这是另一条路由。

2, routes 是一组路由,把上面的每一条路由组合起来,形成一个数组。[{home 按钮 =>home内容 }, { about按钮 => about 内容}]

3, router 是一个机制,相当于一个管理者,它来管理路由。因为routes 只是定义了一组路由,它放在哪里是静止的,当真正来了请求,怎么办? 就是当用户点击home 按钮的时候,怎么办?这时router 就起作用了,它到routes 中去查找,去找到对应的 home 内容,所以页面中就显示了

home 内容。

4,客户端中的路由,实际上就是dom 元素的显示和隐藏。当页面中显示home 内容的时候,about 中的内容全部隐藏,反之也是一样。客户端路由有两种实现方式:基于hash 和基于html5 history api.

vue-router中的路由也是基于上面的内容来实现的

在vue中实现路由还是相对简单的。因为我们页面中所有内容都是组件化的,我们只要把路径和组件对应起来就可以了,然后在页面中把组件渲染出来。

1, 页面实现(html模版中)

在vue-router中, 我们也可以看到它定义了两个标签<router-link> 和<router-view>。 <router-link> 就是定义页面中点击的部分,<router-view> 就是点击后,显示内容的部分。所以 <router-link> 还有一个非常重要的属性 to, 它定义 点击之后,要到哪个路径下 , 如:<router-link  to="/home">Home</router-link>

2, js 中配置路由

首先要定义route,  一条路由的实现。它是一个对象,最基本的一条路由由两个部分组成: path: component.  path 指路径,component 指的是组件。如:{path:'/home', component: home}

我们这里有两条路由,组成一个routes:

const routes = [
 { path: '/home', component: Home },
 { path: '/about', component: About }
]

最后创建router 对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。

const router = new VueRouter({
   routes // short for routes: routes
})

配置完成后,把router 实例注入到 vue 根实例中,就可以使用路由

const app = new Vue({
 router
}).$mount('#app')

执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: '/home', component: Home}  path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 <router-view> 标签。所有的这些实现才是基于hash 实现的。

vue-cli 创建一个项目体验一下, 当然不要忘记安装vue-router

1, 在src 目录下新建两个组件,home.vue 和 about.vue

<template>
  <div>
    <h1>home</h1>
    <p>{{msg}}</p>
  </div>
</template>
<script>
  export default {
    data () {
      return {
        msg: "我是home 组件"
      }
    }
  }
</script>
<template>
  <div>
    <h1>about</h1>
    <p>{{aboutMsg}}</p>
  </div>
</template>
<script>
  export default {
    data () {
      return {
        aboutMsg: '我是about组件'
      }
    }
  }
</script>

2, 在 App.vue中 定义<router-link > 和 </router-view> 

<template>
 <div id="app">
  <img src="./assets/logo.png">
  <header>
  <!-- router-link 定义点击后导航到哪个路径下 -->
   <router-link to="/home">Home</router-link>
   <router-link to="/about">About</router-link>
  </header>
  <!-- 对应的组件内容渲染到router-view中 -->
  <router-view></router-view>  
 </div>
</template>

<script>
export default {
 
}
</script>

3,  在 src目录下再新建一个router.js 定义router, 就是定义 路径到 组件的 映射。

import Vue from "vue";
import VueRouter from "vue-router";

// 引入组件
import home from "./home.vue";
import about from "./about.vue";

// 要告诉 vue 使用 vueRouter
Vue.use(VueRouter);

const routes = [
  {
    path:"/home",
    component: home
  },
  {
    path: "/about",
    component: about
  }
]

var router = new VueRouter({
  routes
})
export default router;

4, 把路由注入到根实例中,启动路由。这里其实还有一种方法,就像store 注入到根实例中,我们可以在main.js中引入路由,注入到根实例中。

import Vue from 'vue'
import App from './App.vue'

// 引入路由
import router from "./router.js"
new Vue({
 el: '#app',
 router, // 注入到根实例中
 render: h => h(App)
})

5, 这时点击页面上的home 和about 可以看到组件来回切换。但是有一个问题,当首次进入页面的时候,页面中并没有显示任何组件。我们想让页面一加载进来就显示home页面,这需要重定向,所谓重定向,其实就是重新给它指定一个方向,比如当用户点击home 的时候,我们让它指向about.

这用到了redirect 配置。刚进入页面的时候,它的路径是 '/', 所以重新定义到home

const routes = [
  {
    path:"/home",
    component: home
  },
  {
    path: "/about",
    component: about
  },
  // 重定向
  {
    path: '/', 
    redirect: '/home' 
  }
]

6, 当我们打开浏览器的控制台,可以看到路由时组件的切换。

首先看到 router-link 标签渲染成了 a 标签,to 属性变成了a 标签的 href 属性,这时就明白了点击跳转的意思。router-view 标签渲染成了我们定义的组件。可以对比一下app.vue 中的标签和控制台中的标签

详解vue-router基本使用

 动态路由

官网给的例子是,不同的用户(就是用户的id不同),它都会导航到同一个user  组件中。这样我们在配置路由的时候,就不能写死, 就是路由中的path属性,不能写死。如 path: “/home”,只有是home的时候,才能显示home 组件,执行的是严格匹配。导航到 user 组件,路径中肯定有user,

id 不同,那就给路径一个动态部分来匹配不同的id. 动态部分 以 : 开头,那么路径就变成了 /user/:id, 这条路由就可以这么写: { path:"/user/:id", component: user }.

再定义一个user组件,页面中添加两个router-link 用于导航, router.js中添加路由配置。user组件随便写一个就好了。

app.vue 更改如下:

<template>
 <div id="app">
  <img src="./assets/logo.png">
  <header>
   <router-link to="/home">Home</router-link>
   <router-link to="/about">About</router-link>
   <!-- 增加两个到user组件的导航,可以看到这里使用了不同的to属性 -->
   <router-link to="/user/123">User123</router-link>
   <router-link to="/user/456">User456</router-link>
  </header>
  <router-view></router-view>  
 </div>
</template>

router.js 更改如下:

const routes = [
  {
    path:"/home",
    component: home
  },
  {
    path: "/about",
    component: about
  },
  /*新增user路径,配置了动态的id*/
  {
    path: "/user/:id",
    component: user
  },
  {
    path: '/', 
    redirect: '/home' 
  }
]

在动态路由中,如果我们想知道路由是从哪里过来的,就是获取到动态部分怎么办? 其实,当整个vue-router 注入到根实例后,在组件的内部,我们是可以通过this.$route.params 来获得这个动态部分的。它是一个对象,属性名,就是路径中定义的动态部分 id, 属性值就是router-link中to 属性中的动态部分,如123。 在组件中,如果想要获取到state 中的状态,我们可以用computed 属性,在这里也是一样,在组件中,定义一个computed 属性dynamicSegment, user 组件修改如下:

<template>
  <div>
    <h1>User</h1>
    <div>我是user组件, 动态部分是{{dynamicSegment}}</div>
  </div>
</template>
<script>
  export default {
    computed: {
      dynamicSegment () {
        return this.$route.params.id
      }
    }
  }
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js function定义函数使用心得
Apr 15 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
Dec 14 Javascript
javascript 在firebug调试时用console.log的方法
May 10 Javascript
javascript object array方法使用详解
Dec 03 Javascript
javascript + jquery实现定时修改文章标题
Mar 19 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 Javascript
js过滤HTML标签完整实例
Nov 26 Javascript
Bootstrap每天必学之标签与徽章
Nov 27 Javascript
简单谈谈js的数据类型
Sep 25 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
Aug 14 Javascript
vue element自定义表单验证请求后端接口验证
Dec 11 Javascript
创建与框架无关的JavaScript插件
Dec 01 Javascript
Vue键盘事件用法总结
Apr 18 #Javascript
javascript实现日期三级联动下拉框选择菜单
Dec 03 #Javascript
jQuery加密密码到cookie的实现代码
Apr 18 #jQuery
微信小程序实战之自定义模态弹窗(8)
Apr 18 #Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
Apr 18 #Javascript
JavaScript错误处理和堆栈追踪详解
Apr 18 #Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 #Javascript
You might like
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
python机器人行走步数问题的解决
2018/01/29 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
Python函数和模块的使用总结
2019/05/20 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python中np是做什么的
2020/07/21 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
金讯Java笔试题目
2013/06/18 面试题
会计应届生的自荐信
2013/12/13 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
大学计划书范文800字
2014/08/14 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
教师远程研修感悟
2015/11/18 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
Redis主从复制操作和配置详情
2022/09/23 Redis