前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(Vue全家桶)Vue-router

(Vue全家桶)Vue-router

作者头像
楠楠
发布2018-09-11 11:47:25
1K0
发布2018-09-11 11:47:25
举报
文章被收录于专栏:郭少华

Vue-router入门

安装vue-router

代码语言:javascript
复制
npm install vue-router --save-dev

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

新增一个页面和路由

  • 在src/components目录下,新建Hi.vue文件
  • 编写文件内容
代码语言:javascript
复制
<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组件增加路由配置
代码语言:javascript
复制
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里加入下面代码

代码语言:javascript
复制
<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的导航代码

代码语言:javascript
复制
<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>标签。

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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>
代码语言:javascript
复制
<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。具体看一下这个子路由的配置写法。

代码语言:javascript
复制
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属性。

代码语言:javascript
复制
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的形式接收,比如直接在模板中显示

代码语言:javascript
复制
<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传参

代码语言:javascript
复制
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}
      ]
      
    }
  ]
})
代码语言:javascript
复制
<router-link :to="{name:'hi1',params:{username:'guosh',id:'888888'}}">Hi1页面</router-link>
  • name:就是我们再路由文件中起的name
  • params:就是我们要传的参数它可以是对象形式

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

代码语言:javascript
复制
{{$route.params.username}}

单页面多路由区域操作

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

代码语言:javascript
复制
    <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区分

代码语言:javascript
复制
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文件里配置路由。

代码语言:javascript
复制
    {
      path: '/params/:newsId/:newsTitle',
      component: params
    }

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

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

代码语言:javascript
复制
<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传值了。

代码语言:javascript
复制
<router-link to="/params/8888/今日头条">Url传值</router-link>|

vue-router 的重定向-redirect

代码语言:javascript
复制
//重定向到主页
 {
      path: 'goHome',
      redirect: '/'
    },
//重定向带参数
    {
      path: '/goparams/:newsId/:newsTitle',
      redirect: '/params/:newsId/:newsTitle'
    }

alias别名的使用

代码语言:javascript
复制
    {
      path: '/Hi1',
      component: Hi1,
      alias: '/guosh'
    }

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

路由的过渡动画

代码语言:javascript
复制
    <transition name="fade" mode="out-in">
      <router-view/>
    </transition>

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

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

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

代码语言:javascript
复制
.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的设置

代码语言:javascript
复制
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

代码语言:javascript
复制
    {
      path: '*',
      component: Error
    }

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

路由中的钩子

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

代码语言:javascript
复制
 {
      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:在路由离开前的钩子函数。
代码语言:javascript
复制
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();
    }
}

编程式导航

代码语言:javascript
复制
<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>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.05.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Vue-router入门
    • 安装vue-router
      • 新增一个页面和路由
        • router-link制作导航
        • vue-router配置子路由
          • 改造App.vue的导航代码
            • 更改Hi页面
              • 在components目录下新建两个组件模板 Hi1.vue 和 Hi2.vue
                • 修改router/index.js代码
                • vue-router参数传递
                  • 用name传递参数
                    • 通过<router-link> 标签中的to传参
                    • 单页面多路由区域操作
                    • vue-router 利用url传递参数
                    • vue-router 的重定向-redirect
                    • alias别名的使用
                    • 路由的过渡动画
                    • mode的设置和404页面的处理
                      • mode的设置
                        • 404页面处理
                        • 路由中的钩子
                          • 路由配置文件中的钩子函数
                            • 写在模板中的钩子函数
                            • 编程式导航
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档