Vue.jsVue.js我爱编程

(Vue全家桶)Vue-router

2018-05-24  本文已影响55人  郭少华

Vue-router入门

安装vue-router

npm install vue-router --save-dev

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

新增一个页面和路由

<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>
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
    }
  ]
})

router-link制作导航

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

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

在 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>

最后在模板里(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:'路径')

写在模板中的钩子函数

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>
上一篇下一篇

猜你喜欢

热点阅读