(Vue全家桶)Vue-router

Vue-router入门

安装vue-router

npm install vue-router --save-dev

如果你在使用vue-cli中已经选择安装了vue-router,那这里不需要重复安装了。

新增一个页面和路由

  • 在src/components目录下,新建Hi.vue文件
  • 编写文件内容
<template>
 <div class="hello">
     <h1>{{msg}}</h1>
 </div>
</template>

<script>
export default {
 name: 'hi',
 data () {
   return {
     msg: 'Hi,Hi,Hi'
   }
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>
  • 在router/index.js文件的上边引入Hi组件引入Hi组件增加路由配置
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Hi from '@/components/Hi'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
      path: '/hi',
      name: 'Hi',
      component: Hi
    }
  ]
})
  • 现在可以通过访问浏览器/hi看到新的页面了

router-link制作导航

制作链接需要<router-link>标签,我们先来看一下它的语法。

<router-link to="/">[显示字段]</router-link>

  • to:是我们的导航路径,要填写的是你在router/index.js文件里配置的path值,如果要导航到默认首页,只需要写成 to="/" ,
  • [显示字段] :就是我们要显示给用户的导航名称,比如首页 新闻页。

在 src/App.vue文件中的template里加入下面代码

<template>
  <div id="app">
    <img src="./assets/logo.png">
     <div>
       <router-link to="/">首页</router-link>
       <router-link to="/hi">Hi页面</router-link>
    </div>
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

vue-router配置子路由

改造App.vue的导航代码

<template>
  <div id="app">
    <img src="./assets/logo.png">
     <div>
       导航:
       <router-link to="/">首页</router-link>|
       <router-link to="/hi">Hi页面</router-link>|
       <router-link to="/hi/hi1">Hi1页面</router-link>|
       <router-link to="/hi/hi2">Hi2页面</router-link>
    </div>
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

更改Hi页面

把Hi.vue改成一个通用的模板,加入<router-view>标签,给子模板提供插入位置。“Hi页面1” 和 “Hi页面2” 都相当于“Hi页面”的子页面,有点想继承关系。我们在“Hi页面”里加入<router-view>标签。

<template>
 <div class="hello">
     <h1>{{msg}}</h1>
     <router-view/>
 </div>
</template>

<script>
export default {
 name: 'hi',
 data () {
   return {
     msg: 'Hi,Hi,Hi'
   }
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

在components目录下新建两个组件模板 Hi1.vue 和 Hi2.vue

<template>
 <div>
   <h1>{{msg}}</h1>
 </div>

</template>

<script>
export default {
 name: 'Hi1',
 data () {
   return {
     msg: 'Hi1,Hi1,Hi1'
   }
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
<template>
 <div>
   <h1>{{msg}}</h1>
 </div>

</template>

<script>
export default {
 name: 'Hi2',
 data () {
   return {
     msg: 'Hi2,Hi2,Hi2'
   }
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

修改router/index.js代码

children字段后边跟的是个数组,数组里和其他配置路由基本相同,需要配置path和component。具体看一下这个子路由的配置写法。

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Hi from '@/components/Hi'
import Hi1 from '@/components/Hi1'
import Hi2 from '@/components/Hi2'

Vue.use(Router)

export default new Router({
 routes: [
   {
     path: '/',
     name: 'HelloWorld',
     component: HelloWorld
   },
   {
     path: '/hi',
     name: 'Hi',
     component: Hi,
     children:[
       {path:'/',component:Hi},
       {path:'hi1',component:Hi1},
       {path:'hi2',component:Hi2}
     ]
     
   }
 ]
})

vue-router参数传递

用name传递参数

在路由文件src/router/index.js里配置name属性。

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Hi from '@/components/Hi'
import Hi1 from '@/components/Hi1'
import Hi2 from '@/components/Hi2'

Vue.use(Router)

export default new Router({
 routes: [
   {
     path: '/',
     name: 'HelloWorld',
     component: HelloWorld
   },
   {
     path: '/hi',
     //name: 'Hi',如果有子路由这不起作用
     component: Hi,
     children:[
       {path:'/',name:'/Hi',component:Hi},
       {path:'hi1',name:'/Hi/Hi1',component:Hi1},
       {path:'hi2',name:'/Hi/Hi2',component:Hi2}
     ]
     
   }
 ]
})

模板里(src/App.vue)用$route.name的形式接收,比如直接在模板中显示

<template>
 <div id="app">
   <img src="./assets/logo.png">
   <div>
      导航:
      <router-link to="/">首页</router-link>|
      <router-link to="/hi">Hi页面</router-link>|
      <router-link to="/hi/hi1">Hi1页面</router-link>|
      <router-link to="/hi/hi2">Hi2页面</router-link>
   </div>
   <p>{{$route.name}}</p>
   <router-view/>
 </div>
</template>

<script>
export default {
 name: 'App'
}
</script>

<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

通过<router-link> 标签中的to传参

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Hi from '@/components/Hi'
import Hi1 from '@/components/Hi1'
import Hi2 from '@/components/Hi2'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
      path: '/hi',
      //name: 'Hi',如果有子路由这不起作用
      component: Hi,
      children:[
        {path:'/',name:'/Hi',component:Hi},
        {path:'hi1',name:'hi1',component:Hi1},
        {path:'hi2',name:'/Hi/Hi2',component:Hi2}
      ]
      
    }
  ]
})
<router-link :to="{name:'hi1',params:{username:'guosh',id:'888888'}}">Hi1页面</router-link>
  • name:就是我们再路由文件中起的name
  • params:就是我们要传的参数它可以是对象形式

最后在模板里(Hi1.vue)用$route.params.username进行接收

{{$route.params.username}}

单页面多路由区域操作

在一个页面里我们有2个以上<router-view>区域,我们通过配置路由的js文件,来操作这些区域的内容。给App.vue文件,在<router-view>下面新写了两行<router-view>标签,并加入了些CSS样式。

    <router-view/>
    <router-view name="left" style="float:left;width:50%;background-color:#ccc;height:300px;"/>
    <router-view name="right" style="float:right;width:50%;background-color:#c0c;height:300px;"/>

不带name是默认区域只能有一个其它需要加name区分

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Hi1 from '@/components/Hi1'
import Hi2 from '@/components/Hi2'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      components:{
        default: HelloWorld,
        left: Hi1,
        right: Hi2
      } 
    },
    {
      path: '/guosh',
      components:{
        default: HelloWorld,
        left: Hi2,
        right: Hi1
      }

    }
  ]
})

上边的代码我们编写了两个路径,一个是默认的‘/’,另一个是’/Hi’.在两个路径下的components里面,我们对三个区域都定义了显示内容。

vue-router 利用url传递参数

1.在配置文件里以冒号的形式设置参数。我们在/src/router/index.js文件里配置路由。

    {
      path: '/params/:newsId/:newsTitle',
      component: params
    }

我们需要传递参数是ID(newsId)和标题(newsTitle).所以我们在路由配置文件里制定了这两个值。

2.在src/components目录下建立我们params.vue组件,也可以说是页面。我们在页面里输出了url传递的的ID和标题。

<template>
 <div>
    <h1>{{mes}}</h1>
    <p>{{$route.params.newsId}}</p>
    <p>{{$route.params.newsTitle}}</p>
 </div>
</template>

<script>
export default {
    name:'params',
    data(){
        return{
            mes:'I m params'
        }
    }
}
</script>

3.在App.vue文件里加入我们的<router-view>标签。这时候我们可以直接利用url传值了。

<router-link to="/params/8888/今日头条">Url传值</router-link>|

vue-router 的重定向-redirect

//重定向到主页
 {
      path: 'goHome',
      redirect: '/'
    },
//重定向带参数
    {
      path: '/goparams/:newsId/:newsTitle',
      redirect: '/params/:newsId/:newsTitle'
    }

alias别名的使用

    {
      path: '/Hi1',
      component: Hi1,
      alias: '/guosh'
    }

redirect和alias的区别 redirect:仔细观察URL,redirect是直接改变了url的值,把url变成了真实的path路径。 alias:URL路径没有别改变,这种情况更友好,让用户知道自己访问的路径,只是改变了<router-view>中的内容。

路由的过渡动画

    <transition name="fade" mode="out-in">
      <router-view/>
    </transition>

我们在/src/App.vue文件里添加了<transition>标签,并给标签起了一个名字叫fade。

过渡模式mode: in-out:新元素先进入过渡,完成之后当前元素过渡离开。 out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入

那我们就在App.vue页面里加入四种CSS样式效果,并利用CSS3的transition属性控制动画的具体效果。代码如下可以实现了淡入淡出的效果:

.fade-enter {
  opacity:0;
}
.fade-leave{
  opacity:1;
}
.fade-enter-active{
  transition:opacity .5s;
}
.fade-leave-active{
  opacity:0;
  transition:opacity .5s;
}

mode的设置和404页面的处理

mode的设置

export default new Router({
  //histroy:当你使用 history 模式时,URL 就像正常的 url,去掉了#号!
  //hash:默认’hash’值,带#号的url
  mode: 'history',
  routes: [
    {
      path: '/',
      component: HelloWorld
    },
    {
      path: '/params/:newsId/:newsTitle',
      component: params
    },
    {
      path: '/goHome',
      redirect: '/'
    },
    {
      path: '/goparams/:newsId/:newsTitle',
      redirect: '/params/:newsId/:newsTitle'
    },
    {
      path: '/Hi1',
      component: Hi1,
      alias: '/guosh'
    }
  ]
})

404页面处理

1.新增一个Error的vue文件 2.设置路由配置文件index.js

    {
      path: '*',
      component: Error
    }

3.当输入找不到的路径时会自动跳转到404页面

路由中的钩子

路由配置文件中的钩子函数

 {
      path: '/params/:newsId/:newsTitle',
      component: params,
      beforeEnter: (to, from, next) => {
        console.log(to);
        console.log(from);
        next(true);
      }

三个参数:

  • to:路由将要跳转的路径信息,信息是包含在对像里边的。
  • from:路径跳转前的路径信息,也是一个对象的形式。
  • next:路由是否跳转,常用的有next(true)和next(false) 更换跳转路径next(path:'路径')

写在模板中的钩子函数

  • beforeRouteEnter:在路由进入前的钩子函数。
  • beforeRouteLeave:在路由离开前的钩子函数。
export default {
    name:'params',
    data(){
        return{
            mes:'I m params'
        }
    },
    beforeRouteEnter: (to, from, next) => {
        console.log('准备进入路由');
        next();
    },
    beforeRouteLeave: (to, from, next) => {
        console.log('准备离开params路由模板');
        next();
    }
}

编程式导航

<button @click="goGo">前进</button>
<button @click="goBack">后退</button>
<button @click="goHome">首页</button>
<script>
export default {
  name: 'App',
  methods:{
    goGo(){
      //前进
      this.$router.go(1);
    },
    goBack(){
      //后退
      this.$router.go(-1);
    },
    goHome(){
      //可以设置任意路径这里是返回到了首页
      this.$router.push("/");
    }
  }
}
</script>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ionic3+

【技巧】ionic3独享滚动区域之滑动segment

其实这两个列表是公用ion-content的滚动条的,也就是说,当列表1滚动到一定距离,当切换到列表2显示时,列表2已滚动到列表1所在的位置了(效果图我就不上了...

1492
来自专栏iKcamp

微信小程序基于最新版1.0开发者工具分享-小试牛刀(视频)+发布流程

第一章:小程序初级入门教程 小试牛刀【含视频】 视频地址:https://v.qq.com/x/page/i0554akzobq.html 这一章节中,我们尝...

2829
来自专栏DannyHoo的专栏

问题——持续更新

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

862
来自专栏偏前端工程师的驿站

前端魔法堂:onsubmit和submit事件处理函数怎么不生效呢?

前言  最近在用Polymer增强form,使其支持表单的异步提交,但发现明明订阅了onsubmit和submit事件,却怎么也触发不了。下面我们将一一道来。 ...

2177
来自专栏菩提树下的杨过

Flash/Flex学习笔记(3):动态添加组件

Flash中一个fla文件可以关联到一个as文件,这个有点类似于asp.net中的code behind. 可参考以下图操作: ? ? ? 注: 1.as文件...

2258
来自专栏liulun

基于Qt的流程设计器(一)

一:先来看一下界面的截图: 说明: 拖动节点的时候,与该节点相关的箭头连线也会跟着调整; 用户可以使用鼠标从一个节点拖出一个箭头到另一个节点(鼠标在空白区域...

2846
来自专栏Pythonista

Golang之并发篇

1203
来自专栏PHP在线

书写高质量jQuery代码的6条经验

一、正确引用jQuery 尽量在body结束前才引入jQuery,而不是在head中。 借助第三方提供的CDN来引入jQuery,同时注意当使用第三方CDN出现...

3819
来自专栏CIT极客

【奇淫巧技】成为网站开发工程师的捷径!

3869
来自专栏DeveWork

自定义WordPress 标签云小工具相关参数

相信你知道WordPress 标签云widget(小工具)是什么,如果你的WordPress 主题支持小工具,就可以在后台启用标签云小工具,该小工具不仅能展示标...

2578

扫码关注云+社区

领取腾讯云代金券