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 相关文章推荐
javascript call方法使用说明
Jan 11 Javascript
jQuery第三课 修改元素属性及内容的代码
Mar 14 Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
Apr 02 Javascript
jQuery事件 delegate()使用方法介绍
Oct 30 Javascript
js读写(删除)Cookie实例详解
Apr 17 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
Jul 15 Javascript
JS实现的打字机效果完整实例
Jun 20 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
详解javascript设计模式三:代理模式
Mar 25 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
Sep 06 Javascript
Vue项目环境搭建详细总结
Sep 26 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
Jun 08 Javascript
解决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中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
JS实现字符串转日期并比较大小实例分析
2015/12/09 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
smartupload实现文件上传时获取表单数据(推荐)
2016/12/12 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Python实现的批量修改文件后缀名操作示例
2018/12/07 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
python实现AdaBoost算法的示例
2020/10/03 Python
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
初中三年学生的学习自我评价
2013/11/13 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
入党个人总结范文
2015/03/02 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫