• 【Vue】(三)vue-router 路由


    1.什么是路由?

    说起路由你想起了什么?

    • 路由是一个网络工程里面的术语。
    • 路由( routing )就是通过互联的网络把信息从源地址传输到目的地址的活动.—维基百科

    额,啥玩意?没听懂

    • 在生活中,我们有没有听说过路由的概念呢?当然了,路由器嘛.

    • 路由器是做什么的?你有想过吗?

    • 路由器提供了两种机制:路由和转送.

      • 路由是决定数据包从来源到目的地的路径.

      • 转送将输入端的数据转移到合适的输出端.

    • 路由中有一个非常重要的概念叫路由表.

      • 路由表本质上就是一个映射表,决定了数据包的指向.

    2.后端路由和前端路由:

    (1)后端路由阶段:

    早期的网站开发整个HTML页面是由服务器来渲染的.

    • 服务器直接生产渲染好对应的HTML页面,返回给客户端进行展示.

    但是,一个网站,这么多页面服务器如何处理呢?

    • 一个页面有自己对应的网址,也就是URL.
    • URL会发送到服务器,服务器会通过正则对该URL进行匹配,并且最后交给一个Controller进行处理.
    • Controller进行各种处理,最终生成HTML或者数据,返回给前端.
    • 这就完成了一个IO操作.

    上面的这种操作,就是后端路由.

    • 当我们页面中需要请求不同的路径内容时,交给服务器来进行处理,服务器渲染好整个页面,并且将页面返回给客户顿.
    • 这种情况下渲染好的页面,不需要单独加载任何的js和css,可以直接交给浏览器展示,这样也有利于SEO的优化.

    后端路由的缺点:

    • 一种情况是整个页面的模块由后端人员来编写和维护的.
    • 另一种情况是前端开发人员如果要开发页面,需要通过PHP和Java等语言来编写页面代码
    • 而且通常情况下HTML代码和数据以及对应的逻辑会混在一起,编写和维护都是非常糟糕的事情.

    image-20220919094754083

    (2)前端路由阶段:

    前后端分离阶段︰

    • 随着Ajax的出现,有了前后端分离的开发模式.
    • 后端只提供API来返回数据,前端通过Ajax获取数据,并且可以通过JavaScript将数据渲染到页面中.
    • 这样做最大的优点就是前后端责任的清晰,后端专注于数据上,前端专注于交互和可视化上.
    • 并且当移动端(iOS/Android)出现后,后端不需要进行任何处理,依然使用之前的一套API即可.
    • 目前很多的网站依然采用这种模式开发.

    单页面富应用阶段:

    • 其实SPA最主要的特点就是在前后端分离的基础上加了一层前端路由.

    • 也就是前端来维护─套路由规则.

      前端路由的核心是什么呢?

      • 改变URL,但是页面不进行整体的刷新。
      • 如何实现呢?

    SPA页面:单页富应用,整个网页只有一个HTML页面。

    image-20220919103547560

    3.URL的hash和HTML5的history:

    URL的hash,如图所示:

    image-20220919111039834

    HTML5的history模式,如图所示:

    image-20220919111257751

    image-20220919111418153

    image-20220919111540696

    4.安装和使用vue-router:

    image-20220919113607713

    5.路由的默认路径和路径模式修改为history

    我们这里还有一个不太好的实现:

    • 默认情况下,进入网站的首页,我们希望渲染首页的内容.
    • 但是我们的实现中,默认没有显示首页组件,必须让用户点击才可以.

    如何可以让路径默认跳到到首页,并且渲染首页组件呢?

    • 非常简单,我们只需要配置多配置一个映射就可以了.

      lconst routes = [
          path: '/',
          redirect: '/home '   //重定向后默认跳转到首页
      
      • 1
      • 2
      • 3

      配置解析:

      • 我们在routes中又配置了一个映射.
      • path配置的是根路径:/
      • redirect是重定向,也就是我们将根路径重定向到/home的路径下,这样就可以得到我们想要的结果了.

    image-20220919143142519

    6.router-link的相关属性:

    image-20220919144450792

    (1)修改linkActiveClass:

    image-20220919144847151

    7.通过代码跳转路由(this.$router.push和this.$router.replace):

    • this.$router.push和history.pushState相对应。
    • this.$router.replace和history.replaceState相对应。

    区别

    • this.$router.replace在浏览器上不能点击返回键返回上个界面。

    • this.$router.push在浏览器上可以点击返回键返回上个界面。

    8.vue-router动态路由的使用:

    
    {
    	path: '/user/:userId',
    	component: User
    }
    
    
    <template>
    	<div>
            <router-link v-bind:to="'/user/'+userId">用户router-link>
            <router-view>router-view>
        div>
    template>
    
    <script>
        export default{
            name: 'App',
            data(){
                return{
                    userId: 'zhangsan'<!--!!!!!!!-->
                }
            }
        }
    script>
    
    
    <template>
    	<div>
            <h1>我是User组件h1>
            <p>我是User组件的内容p>
            <h2>{{userId}}h2>
            <h2>{{$route.params.userId}}h2> 
        div>
    template>
    
    <script>
    	export default{
    		name: 'User',
    		computed: {
    			userId(){
    				this.$route.params.userId <!--在页面上展示当前用户的名字,params.后面的东西和路由index.js文件里的path对应-->
    			}
    		}
    	}
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    运行结果:

    image-20220920100556608

    9.vue-router懒加载:

    • 懒加载:用到的时候才会加载。
    • 一个懒加载在vue里面打包完后的dist文件夹里对应一个js文件(如下图所示)

    image-20220920111659575

    const Home = () => import('../components/Home')
    const About = () => import('../components/About')
    const User = () => import('../components/User')
    
    Vue.use(VueRouter)
    
    const routes=[
    	{
    	path: '/home',
    	component: Home
    },
    	{
    	path: '/about',
    	component: About
    },
    	{
    	path: '/user',
    	component: User
    }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    10.路由的嵌套使用:

    注意点:

    • 子组件在哪里进行渲染就在哪里加上
    • router文件夹下的index.js文件里,path属性中,子组件前面可以不写/,会自动补充
    
    const Home = () => import('../components/Home')
    const HomeNews = () => import('../components/HomeNews')
    const HomeMessage = () => import('../components/HomeMessage')
    
    const routes = [
    	{
    	path: '',
    	redirect: 'news'
    },
    	{
    	path: '/home',
    	component: Home,
    	children: [
    	{
    	path: 'news',
    	component: HomeNews,
    },
    	{
    	path: 'message',
    	component: HomeMessage
    }
    ]
    },
    ]
    
    
    <template>
        <div>
            <h1>我是首页h1>
            <p>我是首页内容p>
            <router-link to="/home/news">新闻router-link>
            <router-link to="/home/message">信息router-link>  
           
            <router-view>router-view>
            
        div>
    template>
    
    <script>
    	export default{
    		name: 'Home'
    	}
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    归结原理、归结演绎推理
    PHP数组的常见操作和常用函数
    【2014年数据结构真题】
    分析-BeanPostProceesor后置处理器
    docker安装部署skywalking
    Redis学习笔记-2.客户端的使用
    react路由根据用户角色设置权限校验
    第十六章 类和对象——运算符重载
    vue3 | 数据可视化实现数字滚动特效
    [PAT练级笔记] 06 Basic Level 1008
  • 原文地址:https://blog.csdn.net/TuPonShuy/article/details/126935843