05-vue-cli-路由配置

一、vue-router 路由

1.vue-router是什么

        这里的路由并不是指我们平时所说的硬件路由器,这里的路由就是SPA(单页应用)的路径管理器。再通俗 的说,vue-router就是WebApp的链接路径管理系统。

        vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应 用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接 来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。路由模块的 本质 就是建立起url和页面之间的映射关系。

        至于我们为啥不能用a标签,这是因为用Vue做的都是单页应用(当你的项目准备打包时,运行 npm run build 时,就会生成dist文件夹,这里面只有静态资源和一个index.html页面),所以你写的标签是不起作用 的,你必须使用vue-router来进行管理

二、vue-router-实现原理

        SPA(single page application):单一页面应用程序,只有一个完整的页面;它在加载页面时,不会加载整个页 面,而是只更新某个指定的容器中内容。

        单页面应用(SPA)的核心之一是: 更新视图而不重新请求页面;

        vue-router在实现单页面前端路由时,提供了两种方式:Hash模式和History模式;根据mode参数来决定采用 哪一种方式。

1、Hash模式,#锚点

        vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重 新加载。 hash(#)是URL 的锚点,代表的是网页中的一个位置,单单改变#后的部分,浏览器只会滚动到相应 位置,不会重新加载网页,也就是说hash 出现在 URL 中,但不会被包含在 http 请求中,对后端完全没有影响, 因此改变 hash 不会重新加载页面;同时每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使 用”后退”按钮,就可以回到上一个位置;所以说Hash模式通过锚点值的改变,根据不同的值,渲染指定DOM位 置的不同数据。hash 模式的原理是 onhashchange 事件(监测hash值变化),可以在 window 对象上监听这个事

件。

2、History模式,传统模式,/

        由于hash模式会在url中自带#,如果不想要很丑的 hash,我们可以用路由的 history 模式,只需要在配置路

        由规则时,加入"mode: 'history'",

        在router目录下的index.js文件,添加history 模式这个时候地址栏里可以不要#号了

三、vue-router-404页面

        当我们使用History模式, 如果用户输错页面地址,返回的页面是空白,很不友好。

        当用户输错页面时,我们希望给他一个友好的提示页面,这个页面就是我们常说的404页面。vue-router也为 我们提供了这样的机制

1 创建error404.vue页面

<template>
  <div>
      <h1>404错误!请检查你的地址是否正确!</h1>
  </div>
</template>

<script>
</script>

<style>
</style>

2 在路由目录下的index.js 引入error组件

import Vue from 'vue'
import Router from 'vue-router'
/*  配置地址,叫组件
    第一种:导入hello组件
    */
import error404 from '../components/demo/error404.vue'

Vue.use(Router)

export default new Router({
  // 切换到history模式
  mode:"history",
  routes: [
    {
      path: '*',  //*,通配所有的错误地址
      name: 'error404',
      component: error404
    },
  ]
})

3 配置error路由地址,地址* 通配所有错误地址

    {
      path: '*',  //*,通配所有的错误地址
      name: 'error404',
      component: error404
    },

4 完毕,如果输入错误路由地址,就会看到error页面信息

四、vue-router-路由导航

1. 编程式的导航

2. 声明式的导航

1.编程式的导航

1.1第一种: this.$router.replace()函数

//第一种:指定路由的name完成页面跳转

        this.$router.replace({name:"表格组件"})

//第二种:指定路由的path完成页面跳转

        this.$router.replace("/table")

replace:是不能回退的,银行系统不能用。安全性更高

<template>
  <div>
    <h1>编程时导航</h1>
    <button type="button" @click="test01" >1:用replace方法以url地址作为参数调整</button>
    <button type="button" @click="test02" >2:用replace方法以name地址作为参数调整</button>
  </div>
</template>

<script>
  export default {
    name:"testLogin",
    methods:{
      test01(){
        //replace以url作为参数
        this.$router.replace("/testIndex");
      },
      test02(){
        //replace以name作为参数
        this.$router.replace({"name":"testIndex"});
      },
    }

  }
</script>

<style>
</style>

1.2 第二种: this.$router.push()函数

//第一种:指定路由的name完成页面跳转

        this.$router.push({name:"表格组件"})

//第二种:指定路由的path完成页面跳转

        this.$router.push("/table")

push:可以回退到上一个页面,安全性不高

<template>
  <div>
    <h1>编程时导航</h1>
    <button type="button" @click="test03" >3:用push方法以url地址作为参数调整</button>
    <button type="button" @click="test04" >4:用push方法以name地址作为参数调整</button>
  </div>
</template>

<script>
  export default {
    name:"testLogin",
    methods:{
      test03(){
        //push以url作为参数
        this.$router.push("/testIndex");
      },
      test04(){
        //push以url作为参数
        this.$router.push({"name":"testIndex"});
      },

    }

  }
</script>

<style>
</style>

1.3.$router.push 和 $router.replace 的区别:

        使用push方法的跳转会向 history 栈添加一个新的记录,当我们点击浏览器的返回按钮时可以看到之前的页面。

        使用replace方法不会向 history 添加新记录,而是替换掉当前的 history 记录,即当replace跳转到的网页后,‘后退’按钮不能查看之前的页面。

2.编程式导航传参

2.1 在testLogin组件 定义导航

        把 one的值 传到testIndex组件中

test02(){
        //replace以name作为参数
        this.$router.replace({
            "name":"testIndex",
            query:{
                    "name":this.userName,
                    "pwd":"123",
                  },
          });
      },
      test04(){
        //push以url作为参数
        this.$router.push({
            "name":"testIndex",
            query:{"name":this.userName},
          });
      },

2.2 在testIndex组件中接收传值

$route.query.one ,在页面取值如下:

<template>
    <div>
      <span>testIndex</span>
      <span>{
   
   {$route.query.name}}</span>
    </div>
</template>

2.3 在testIndex的js代码中取值

<script>
  export default{
      name:"testIndex",
      mounted(){  //挂载函数
        var name = this.$route.query.name;
        console.log("name"+name);
      }
  }
</script>

3.声明式的导航

 <h1>声明式导航</h1>
 //指定路由的name完成页面跳转
  <router-link :to="{'name':'testIndex'}">1:页面跳转不传值</router-link>

4.声明式导航传参

1. 在 testLogin 组件 定义一个标签要把 'userName' 传到testIndex组件中

  <h1>声明式导航</h1>
  <router-link :to="{'name':'testIndex',query:{'name':userName}}">2:页面跳转传值</router-link>

2. 在testIndex组件中接收传值 : $route.query.one ,在页面取值如下:

<template>
    <div>
      <span>testIndex</span>
      <span>{
   
   {$route.query.name}}</span>
    </div>
</template>

3.在testIndex的js代码中取值

<script>
  export default{
      name:"testIndex",
      mounted(){  //挂载函数
        var name = this.$route.query.name;
        console.log("name"+name);
      }
  }
</script>

猜你喜欢

转载自blog.csdn.net/weixin_46048259/article/details/127461812