vue-router基础

vue-router基础

安装vue-router

vue-router是一个插件包,所以我们还是需要用npm来进行安装的。打开命令行工具,进入你的项目目录
输入npm install vue-router --save-dev
在安装vue-cli时,会有提示问你要不要安装vue-router,装过就不用再装了

解读router/index.js文件

import Vue from 'vue'   //引入Vue
import Router from 'vue-router'  //引入vue-router
import Hello from '@/components/Hello'  //引入根目录下的Hello.vue组件

Vue.use(Router)  //Vue全局使用Router

export default new Router({
  routes: [              //配置路由,这里是个数组
    {                    //每一个链接都是一个对象
      path: '/',         //链接路径
      name: 'Hello',     //路由名称,
      component: Hello   //对应的组件模板名称,就是上面import定义的那个Hello
    }
  ]
})

简单使用

** 增加一个Hi的路由和页面 **
对路由的核心文件熟悉后,我们试着增加一个路由配置,我们希望在地址栏输入 http://localhost:8080/#/hi
在src/components目录下,新建 Hi.vue 文件。
编写文件内容,和我们之前讲过的一样,文件要包括三个部分<template><script>和<style>

image-20210128171426917

然后在router/index.js文件下面配置
引入 Hi组件:
import Hi from '@/components/Hi'   
增加路由配置,在router/index.js文件的routes[]数组中,新增加一个对象
{
path:'/hi',
name:'Hi',
component:Hi
}

router-link制作导航

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

配置子路由

子菜单的路由方式,也叫子路由。子路由的情况一般用在一个页面有他的基础模版,然后它下面的页面都隶属于这个模版,只是部分改变样式
接着上面的Hi页面,我们继续在component/ 目录下创建同样的和Hi同样的模板,命名为Hi1,Hi2
修改router/index.js代码
children字段后边跟的是个数组,数组里和其他配置路由基本相同,需要配置path和component。
{
        path: '/Hi',
        name: "Hi",
        components: {
            default: Hi,
            left: Hi1,
            right: Hi2
        },
        children: [{
            path: "/Hi1",
            name: 'Hi1',
            component: Hi1
        }, {
            path: '/Hi2',
            name: 'Hi2',
            component: Hi2
        }]
    }
记得在顶部引入Hi1和Hi2
import Hi1 from '@/components/Hi1'
import Hi2 from '@/components/Hi2'

vue-router 传递参数

用name传递参数

首先在路由文件src/router/index.js里配置name属性。
routes: [
{
  path: '/',
  name: 'Hello',
  component: Hello
}
]
然后模板里(src/App.vue)用$route.name的形势接收,比如直接在模板中显示:
<p>{{ $route.name}}</p>
基本语法:
<router-link :to="{name:xxx,params:{key:value}}">valueString</router-link>

这里的to前边是带冒号的,然后后边跟的是一个对象形势的字符串.
name:就是我们在路由配置文件中起的name值。
params:就是我们要传的参数,它也是对象形势,在对象里可以传递多个值。
在App.vue中添加router-link
<router-link :to="{name:'Hi',params:{author:'xmlt'}}">Hi 页面</router-link>
在Hi.vue中接收参数
<template>
    <div>
        <h1>{{message}} {{$route.params.author}}</h1>
    </div>
</template>

<script>
export default {
    name:'hi',
    data(){
        return {
            message:"Hi , I'm Lisa "
        }
    }
}
</script>

<style scoped></style>

用url传递参数

首先url传递参数需要在index.js文件配置路由时就把键名写在路径里
{
    path:'/params/:newsId/:newsTitle',
     component:Params
}
然后在src/components目录下建立我们params.vue组件,也可以说是页面。我们在页面里输出了url传递的的newsID和newsTitle。
<template>
    <div>
        <h2>{{ msg }}</h2>
        <p>新闻ID:{{ $route.params.newsId}}</p>
        <p>新闻标题:{{ $route.params.newsTitle}}</p>
    </div>
</template>

<script>
export default {
  name: 'params',
  data () {
    return {
      msg: 'params page'
    }
  }
}
</script>
最后,在App.vue中用router-link引入键值
<router-link to="/params/198/jspang website is very good">params</router-link> 

正则表达式在URL传值中的应用

传递的新闻ID只能是数字的形式,这时候我们就需要在传递时有个基本的类型判断,vue是支持正则的。

加入正则需要在路由配置文件里(/src/router/index.js)以圆括号的形式加入。

path:'/params/:newsId(\\d+)/:newsTitle',
加入了正则,我们再传递数字之外的其他参数,params.vue组件就没有办法接收到。甚至会导致其他的内容无法渲染

单页面多路由区域操作

在一个页面里我们有2个以上`<router-view>`区域,我们通过配置路由的js文件,来操作这些区域的内容。
首先在App.vue中创建两个或两个以上的router-link,设置一些样式便于区分
<router-view ></router-view>

 <router-view name="left" style="float:left;width:50%;background-color:#ccc;height:300px;"></router-view>
 
 <router-view name="right" style="float:right;width:50%;background-color:#c0c;height:300px;"></router-view>
然后在index.js中配置多路由
export default new Router({
  routes: [
    {
      path: '/',
      components: {
        default:Hello,
        left:Hi1,
        right:Hi2
      }
    },{
      path: '/Hi',
      components: {
        default:Hello,
        left:Hi2,
        right:Hi1
      }
    }

  ]
})
//这样router-view name="left"的区域就显示Hi2.vue的内容,router-view name="right"显示Hi1.vue

重定向 redirect

我们只要在路由配置文件中(/src/router/index.js)把原来的component换成redirect参数就可以了
export default new Router({
  routes: [
    {
      path: '/',
      component: Hello
    },{
      path:'/params/:newsId(\\d+)/:newsTitle',
      component:Params
    },{
      path:'/goback',
      redirect:'/'
    }

  ]
})
这样的话,<router-link to="/goback">goback实际上时Hello</router-link>点击后就会去到Hello页面
或者在地址栏中输入localhost://8080/#/goback 就会去到Hello页面

重定向时传递参数

只需要在ridirect后边的参数里复制重定向路径的path参数就可以了
{
  path:'/params/:newsId(\\d+)/:newsTitle',
  component:Params
},{
  path:'/goParams/:newsId(\\d+)/:newsTitle',
  redirect:'/params/:newsId(\\d+)/:newsTitle'
}
已经有了一个params路由配置,我们在设置一个goParams的路由重定向,并传递了参数。这时候我们的路由参数就可以传递给params.vue组件了。参数接收方法和正常的路由接收方法一样。

别名 alias

使用alias别名的形式,我们也可以实现类似重定向的效果。
首先我们在路由配置文件里(/src/router/index.js)
{
 path: '/HHH',
        name: "HHH",
        components: {
            default: Hi,
            left: Hi2,
            right: Hi1
        },
        alias: '/xmlt'
    }
<router-link < to="/xmlt">jspang</router-link>就会跳转到/HHH页面

redirect和alias的区别

redirect:仔细观察URL,redirect是直接改变了url的值,把url变成了真实的path路径。
alias:URL路径没有别改变,这种情况更友好,让用户知道自己访问的路径,只是改变了<router-view>中的内容。
别名请不要用在path为’/’中,如下代码的别名是不起作用的
{
  path: '/',
  component: Hello,
  alias:'/home'
}

过渡动画

过渡动画使用css中的translation标签来制作
想让路由有过渡动画,需要在<router-view>标签的外部添加<transition>标签,标签还需要一个name属性。
注意,一个translation标签内部只能有一个<router-view>
例:
<transition name="fade">
  <router-view ></router-view>
</transition>
我们在/src/App.vue文件里添加了<transition>标签,并给标签起了一个名字叫fade(这里的名字可以任意)

 css过渡类名 :组件过渡过程中,会有四个CSS类名进行切换,这四个类名与transition的name属性有关,比如name=”fade”,会有如下四个CSS类名:

fade-enter:进入过渡的开始状态,元素被插入时生效,只应用一帧后立刻删除。
fade-enter-active:进入过渡的结束状态,元素被插入时就生效,在过渡过程完成后移除。
fade-leave:离开过渡的开始状态,元素被删除时触发,只应用一帧后立刻删除。
fade-leave-active:离开过渡的结束状态,元素被删除时生效,离开过渡完成后被删除。

从上面四个类名可以看出,fade-enter-active和fade-leave-active在整个进入或离开过程中都有效,所以CSS的transition属性在这两个类下进行设置。
在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模式in-out模式,这并不是我们想要的。
in-out模式会导致先加载后移出,如果后移出的DOM元素后面还有别的元素就会导致不移出的元素顶上去,很恼火
过渡模式mode:
in-out:新元素先进入过渡,完成之后当前元素过渡离开。
out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入。
<transition name="fade" mode="out-in">
     <router-view name="right" style="float:left;height:300px;width:50%;background-color:#c00"></router-view>
   </transition>

mode的设置和404页面的处理

 mode的三个值 

histroy:当你使用 history 模式时,URL 就像正常的 url,例如 http://jsapng.com/lms/,url里不含#/

hash:默认’hash’值,但是hash看起来就像无意义的字符排列,不太好看也不符合我们一般的网址浏览习惯。url含#/

abstract: 地址栏里的url不会随着页面的改变而改变
配置位置

image-20210128191451953

404页面
凡是没有在index.js里注册过的路径我们都可以使用*来代替
{
        path: '*',
        component: error
    }
    地址栏输入错误、不存在的路径都会把链接转向 * 所在的error页面
之后我们再制作一个error页面来输出相关信息就可以了
<template>
    <div>
        <h2>{{msg}}</h2>
    </div>
</template>
<script>
export default {
    name:'error',
    data(){
        return{
            msg:'Not found 404'
        }
    }
}
</script>
<style scoped></style>

路由中的生命周期函数(钩子函数)

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

我们可以直接在路由配置文件(/src/router/index.js)中写钩子函数。但是在路由文件中我们只能写一个beforeEnter,就是在进入此路由配置时。只有一个钩子函数
{
      path:'/params/:newsId(\\d+)/:newsTitle',
      component:Params,
      beforeEnter:(to,from,next)=>{
        console.log('我进入了params模板');
        console.log(to);
        console.log(from);
        next();
}
我们在params路由里配置了bdforeEnter得钩子函数,函数我们采用了ES6的箭头函数,需要传递三个参数。我们并在箭头函数中打印了to和from函数。具体打印内容可以在控制台查看object。

三个参数:

to:路由将要跳转的路径信息,信息是包含在对像里边的。
from:路径跳转前的路径信息,也是一个对象的形式。
next:路由的控制参数,常用的有next(true)和next(false)。必须有next()

写在模板中的钩子函数

写在模板中就可以有两个钩子函数可以使用
beforeRouteEnter:在路由进入前的钩子函数。
beforeRouteLeave:在路由离开前的钩子函数。
export default {
  name: 'params',
  data () {
    return {
      msg: 'params page'
    }
  },
  beforeRouteEnter:(to,from,next)=>{
    console.log("准备进入路由模板");
    next();
  },
  beforeRouteLeave: (to, from, next) => {
    console.log("准备离开路由模板");
    next();
  }
}
</script>
写在params.vue模板里的路由钩子函数。它可以监控到路由的进入和路由的离开,也可以轻易的读出to和from的值。

编程式导航

this.$router.go(-1) 和 this.$router.go(1)

这两个函数对应着让页面后退和前进
.我们先在app.vue文件里加入一个按钮,按钮并绑定一个goback( )方法。

<button @click="goback">后退</button>
在我们的script模块中写入goback()方法,并使用this.$router.go(-1),进行后退操作。

<script>
export default {
  name: 'app',
  methods:{
    goback(){
      this.$router.go(-1);
    }
  }
}
</script>

this.$router.push(‘/xxx ‘)

这个编程式导航都作用就是跳转,比如我们判断用户名和密码正确时,需要跳转到用户中心页面或者首页,都用到这个编程的方法来操作路由。
我们设置一个按钮,点击按钮后回到站点首页。

先编写一个按钮,在按钮上绑定goHome( )方法。

<button @click="goHome">回到首页</button>
在<script>模块里加入goHome方法,并用this.$router.push(‘/’)导航到首页

export default {
  name: 'app',
  methods:{
    goback(){
      this.$router.go(-1);
    },
    goHome(){
      this.$router.push('/');
    }
  }
}
posted @ 2021-03-03 17:46  xmlt  阅读(163)  评论(0)    收藏  举报