Vue-Router的使用方法


Posted in Javascript onSeptember 05, 2018

使用 Vue.js 做项目的时候,一个页面是由多个组件构成的,所以在跳转页面的时候,并不适合用传统的 href,于是 vue-router 应运而生。

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

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

官方文档: https://router.vuejs.org/zh-cn/essentials/getting-started.html

Vue-Router的最简单使用

1.先注册路由

2.将路由注册到VM组件中

3.定义组件

4.页面定义跳转路径

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
    <script src="lib/vue.min.js"></script>
    <script src="lib/vue-router-3.0.1.js"></script>
    <style type="text/css">
    </style>
  </head>
  <body>
    
    <div id="app">
      <!--
        由于Vue-router的hash匹配原则所以我们需要在原定义的路径上加一个#号
      -->
      <a href="#/login" rel="external nofollow" rel="external nofollow" >登录</a>
      <a href="#/register" rel="external nofollow" rel="external nofollow" >注册</a>
      <router-view></router-view>
    </div>
  </body>
  <script>
    var login={
      template:'<h1>登录组件</h1>'
    }
    var register={
      template:'<h1>注册组件</h1>'
    }
    var routerObj = new VueRouter({
      routes:[
      //此处的component只能使用组件对象,而不能使用注册的模板的名称
        {path:"/login",component:login},
        {path:"/register",component:register}
      ]
    })
    var vm = new Vue({
      el:'#app',
      data:{
      },
      methods:{
        
      },
      router:routerObj//将路由规则对象注册到VM实例上
    })
  </script>
</html>

使用Router-Link替代a标签

这么做主要是为了去掉a标签中的为了匹配hash地址的“#”,如下

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
    <script src="lib/vue.min.js"></script>
    <script src="lib/vue-router-3.0.1.js"></script>
    <style type="text/css">
    </style>
  </head>
  <body>
    
    <div id="app">
      <!--
        由于Vue-router的hash匹配原则所以我们需要在原定义的路径上加一个#号
      -->
<!--      <a href="#/login" rel="external nofollow" rel="external nofollow" >登录</a>
      <a href="#/register" rel="external nofollow" rel="external nofollow" >注册</a>-->
      <router-link to="/login" tag="span">登录</router-link>
      <router-link to="/register">注册</router-link>
      <router-view></router-view>
    </div>
  </body>
  <script>
    var login={
      template:'<h1>登录组件</h1>'
    }
    var register={
      template:'<h1>注册组件</h1>'
    }
    var routerObj = new VueRouter({
      routes:[
      //此处的component只能使用组件对象,而不能使用注册的模板的名称
        {path:"/login",component:login},
        {path:"/register",component:register}
      ]
    })
    var vm = new Vue({
      el:'#app',
      data:{
      },
      methods:{
        
      },
      router:routerObj//将路由规则对象注册到VM实例上
    })
  </script>
</html>

同时,我们还可以利用tag标签来渲染router-link元素,router-link默认渲染为a链接元素,使用tag标签可以渲染其他元素,上述代码中渲染为span元素了。无论渲染成什么元素,都依然与a连接一样拥有跳转的点击事件

重定向技术以及默认路径

默认路径

我们可以使用默认路径的方式指定根路径,只需要在上述路由定义的方式中加入默认路径即可

var routerObj = new VueRouter({
      routes:[
      //此处的component只能使用组件对象,而不能使用注册的模板的名称
        {path:"/",component:login},
        {path:"/login",component:login},
        {path:"/register",component:register}
      ]
    })

重定向方式指定默认路径

同样的使用一行代码即可直接重定向到login路径下,相比上述的默认路径,此方式在url的展示上更为明显

var routerObj = new VueRouter({
      routes:[
      //此处的component只能使用组件对象,而不能使用注册的模板的名称
        {path:"/",redirect:"/login"},
        {path:"/login",component:login},
        {path:"/register",component:register}
      ]
    })

路由选中之后高亮设置

使用默认类设置为高亮

Vue为router-link内置了一个连接点击之后高亮的类router-link-active,即可以在自己的style中设置

 

<style type="text/css">
      .router-link-active{
        color: red;
        font-weight: 800;
        font-style: italic;
        font-size: 30px;
      }
    </style>

使用自定义类名

当我们想使用第三方定义的选中样式,或者是自己想定义更为简洁的样式,可以使用linkActiveClass来定义,即在路由初始化时指定类名,在指定样式时再自定义样式

var routerObj = new VueRouter({
      routes:[
      //此处的component只能使用组件对象,而不能使用注册的模板的名称
        {path:"/",redirect:"/login"},
        {path:"/login",component:login},
        {path:"/register",component:register}
      ],
      linkActiveClass:'myactive'
    })

指定样式

<style type="text/css">
      .router-link-active,.myactive{
        color: red;
        font-weight: 800;
        font-style: italic;
        font-size: 30px;
      }
    </style>

路由传参

使用query方式传递参数

首先我们再设置路由链接是指定参数

<router-link to="/login?id=10&name=zhao">登录</router-link>

且可以指定并获取多个参数,主要是再定义的组件对象内部使用created方法来获得

var login={
      template:'<h1>登录组件---{{$route.query.id}}--{{$route.query.name}}</h1>',
      created(){
        console.log(this.$route.query.id)
      }
    }

使用params方式传递参数

首先我们在路由定义的时候采用:定义params参数

var routerObj = new VueRouter({
      routes:[
      //此处的component只能使用组件对象,而不能使用注册的模板的名称
        {path:"/login/:id/:name",component:login},
        {path:"/register",component:register}
      ],
    })

在实际使用过程中如何传递

<router-link to="/login/10/zhao">登录</router-link>
      <router-link to="/register">注册</router-link>
      <router-view></router-view>

在组件中使用

var login={
      template:'<h1>登录组件---{{$route.params.id}}</h1>',
      created(){
        console.log(this.$route.params.id)
      }
    }

路由嵌套的实现

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
    <script src="lib/vue-2.4.0.js"></script>
    <script src="lib/vue-router-3.0.1.js"></script>
    <style type="text/css">

    </style>
  </head>
  <body>
 <div id="app">

  <router-link to="/account">Account</router-link>

  <router-view></router-view>

 </div>

 <template id="tmpl">
  <div>
   <h1>这是 Account 组件</h1>

   <router-link to="/account/login">登录</router-link>
   <router-link to="/account/register">注册</router-link>

   <router-view></router-view>
  </div>
 </template>

 <script>

  // 组件的模板对象
  var account = {
   template: '#tmpl'
  }

  var login = {
   template: '<h3>登录</h3>'
  }

  var register = {
   template: '<h3>注册</h3>'
  }

  var router = new VueRouter({
   routes: [
    {
     path: '/account',
     component: account,
     // 使用 children 属性,实现子路由,同时,子路由的 path 前面,不要带 / ,否则永远以根路径开始请求,这样不方便我们用户去理解URL地址
     children: [
      { path: 'login', component: login },
      { path: 'register', component: register }
     ]
    }
}
   ]
  })

  // 创建 Vue 实例,得到 ViewModel
  var vm = new Vue({
   el: '#app',
   data: {},
   methods: {},
   router
  });
 </script>
</body>
</html>

主要是由children属性来实现的,上述代码中由三个易错点

1.定义路由时,子路由没有‘/'

2.在父组件中定义子组件要写子组件的全路径

3.在父组件中定义组件同样要加入router-view元素

案例:路由命名视图实现经典布局

命名视图在定义路由时使用components属性(注意不是component)来定义:

var routerObj = new VueRouter({
      routes:[
      //此处的component只能使用组件对象,而不能使用注册的模板的名称
        {path:"/",components:{
          default:header,
          left:leftBox,
          main:mainBox
        }},
      ]
    })

几个组件分别定义如下

var header={
      template:'<h1 class="header">头部区域</h1>'
    }
    var leftBox={
      template:'<h1 class=left>左部菜单区域</h1>'
    }
    var mainBox={
      template:'<h1 class="main">主体内容区域</h1>'
    }

我们在页面上使用上述命名视图时使用router-view的name属性来定义

<div id="app">
      <router-view></router-view>
      <div id="container">
        <router-view name="left"></router-view>
        <router-view name="main"></router-view>
      </div>

    </div>

未使用命名属t性name设置视图组件的将采用default命名视图

设置一下样式

<style type="text/css">
    html,body{
      margin: 0;
      padding: 0;
    }
    h1{
      margin: 0;
      padding: 0;
      font-size: 16px;
    }
    .header{
      background-color: #6495ED;
      height: 200px;
    }
    
    #container{
      display: flex;
      height: 600px;
    }
    .left{
      flex: 2;
      background-color: #0000FF;
    }
    .main{
      flex: 8;
      background-color: #8A2BE2;
    }
  </style>

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

Javascript 相关文章推荐
新手入门常用代码集锦
Jan 11 Javascript
基于jQuery试卷自动排版系统
Jul 18 Javascript
jQuery .tmpl(), .template()学习资料小结
Jul 18 Javascript
详解js跨域原理以及2种解决方案
Dec 09 Javascript
jquery UI Datepicker时间控件的使用及问题解决
Apr 28 Javascript
功能强大的Bootstrap组件(结合js)
Aug 03 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
Oct 24 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
Oct 26 Javascript
Vue.js系列之项目结构说明(2)
Jan 03 Javascript
详解vue 数据传递的方法
Apr 19 Javascript
vue项目实现图片上传功能
Dec 23 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
解决vue 绑定对象内点击事件失效问题
Sep 05 #Javascript
Vue作用域插槽slot-scope实例代码
Sep 05 #Javascript
element ui 表格动态列显示空白bug 修复方法
Sep 04 #Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
Jan 30 #Javascript
Vue中android4.4不兼容问题的解决方法
Sep 04 #Javascript
element-ui 上传图片后清空图片显示的实例
Sep 04 #Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
Sep 04 #Javascript
You might like
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
用户注册常用javascript代码
2009/08/29 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
js登录弹出层特效
2014/03/07 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
Python反射用法实例简析
2017/12/22 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
python扫描线填充算法详解
2020/02/19 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
财务经理的岗位职责
2013/12/17 职场文书
玲玲的画教学反思
2014/02/04 职场文书
房屋买卖协议样本
2014/11/16 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
秋季运动会加油词
2015/07/18 职场文书
python b站视频下载的五种版本
2021/05/27 Python
手残删除python之后的补救方法
2021/06/26 Python