vue中的路由router详解

路由(router)

  1. 后端路由:所有的超链接都是URL地址,所有的URL地址都定义服务器上对应的资源
  2. 前端路由:对于单页面应用程序来说,通过URL中的hash值(#号)来实现不同页面之前的切换

hash有一个特点:http请求中不会包含hash相关的内容,所以,单页面应用程序中的页面跳转主要是用hash实现

路由的基本使用

  1. 引入文件(vue.js和vue-router.js)
  2. 创建路由对象,路由对象中有routes(配置对象),配置对象中有两个属性path(监听路由的链接地址)和component(对应的组件对象)
  3. 挂载到Vue实例中
  4. 使用<router-view>标签展示
  5. 使用<router-link to="跳转的地址">标签用于超链接的跳转
  6. 默认渲染为<a>标签,通过tag属性可以改变标签,依然保持点击跳转事件
  7. 在router-link标签中添加 replace 属性 则 无历史回退记录
<div class="app">
    <!--vue-router提供了<router-link to='/跳转的地址'>标签用于超链接的跳转,可以省略#号,
    默认渲染为<a>标签,通过tag属性可以改变标签,依然保持点击跳转事件-->
    <router-link to="/login" tag="span" >登录</router-link>
    <router-link to="/register">注册</router-link>

    <!--4.使用:通过Vue-router提供的router-view标签-->
        <router-view></router-view>

</div>
<script src="../lib/vue-2.4.0.js"></script>
<!--1. 引入Vue-router文件-->
<script src="../lib/vue-router-3.0.1.js"></script>
<script>

    //组件对象
    var login = {
        template: '<h1>登录页面</h1>'
    }
    var register = {
        template: '<h1>注册页面</h1>'
    }

    /* 2. 创建路由对象,路由对象中有一个routes(配置对象)属性是一个数组,
     配置对象中有两个属性path(监听路由链接地址)和component(对应的组件对象)*/
    var routerObj = new VueRouter({
        routes: [
            {path: '/', redirect: '/login'},    /*重定向*/
            {path: '/login', component: login},
            {path: '/register', component: register}
        ]
    });

    var vm = new Vue({
        el: '.app',
        data: {},
        methods: {},
        /*3. 挂载到Vue实例中的router属性*/
        router: routerObj
    })
</script>

选中 高亮显示

方式①:通过<router-link>所提供的类=>router-link-active设置样式

方式②:改变<router-link>所提供的类=>创建路由对象中,加入一个属性(linkActiveClass), linkActiveClass:'myactive' ,此时,对myactive类设置样式


路由传参

方式①:query 如果在路由中,使用查询字符串,给路由传递参数,则不需要修改路由规则的path属性

<router-link to="/login?id=11&name=zs"></router-link>

(this.$route.query): 通过this.$route.query.id拿到对应的id的值,通过this.$route.query.name拿到对应的name的值

 

 

方式②:params  

  1. 改变路由规则path的属性{path:/login/:id/:name等以此类推,component:login}
  2. <router-link to='/login/12/zs等以此类推'></router-link>
  3. (this.$route.params)  : 通过this.$route.params.id获取对应的id的值。。。。
<div class="app">
    <!--通过改变路由规则的path属性 和 对应的router-link to= ''的值实现传参-->
    <router-link to="/login/10/lang">登录</router-link>
    <router-link to="/register">注册</router-link>
    <router-view></router-view>
</div>
<script src="../lib/vue-2.4.0.js"></script>
<script src="../lib/vue-router-3.0.1.js"></script>
<script>

    /*组件对象*/
    var login = {
        template:'<h1>登录界面----{{ $route.params.id }}-------{{ $route.params.name }}</h1>',
        created(){
            /*通过this.$route.params获取地址栏中的参数*/
            console.log(this.$route.params)
        }
    }
    var register = {
        template:'<h1>注册界面</h1>'
    }

    /*创建路由对象*/
    var router = new VueRouter({
        routes:[
            {path:'/login/:id/:name',component:login},
            {path:'/register',component:register}
        ]
    })

  var vm = new Vue({
        el:'.app',
        data:{},
      /*挂载到Vue实例中(属性和值相同可直接写router)*/
      router
    })
</script>

路由的嵌套(子路由)

路由规则中新增一个children属性,是一个数组,再次存放path和component

注意:children中的path的值不能带‘ / ’,

<div id="app">
    <router-link to="/account">Account</router-link>
    <router-view></router-view>
</div>

<template id="tmpl">
    <div>
        <h1>这是 Account 组件</h1>
<!--Account的子组件--->
        <router-link to="/account/login">登录</router-link>
        <router-link to="/account/register">注册</router-link>
        <router-view></router-view>
    </div>
</template>

<script>

    // 组件的模板对象
    var account = {
        template: '#tmpl'
    }

    var login = {
        template: '<h3>登录</h3>'
    }

    var register = {
        template: '<h3>注册</h3>'
    }

    var router = new VueRouter({
        routes: [
            {
                path: '/account',
                component: account,
                // 使用 children 属性,实现子路由,同时,子路由的 path 前面,不要带 / ,否则永远以根路径开始请求,这样不方便我们用户去理解URL地址
                children: [
                    {path: 'login', component: login},
                    {path: 'register', component: register}
                ]
            }
        ]
    })

    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {},
        router
    });
</script>

命名视图实现布局方式

通过路由规则的components属性,是一个对象,值可以有多个组件对象

注意:是components,带个s,是一个对象

{ path:"/" , components:{

    default:组件对象,       //默认的展示组件

    name的值:组件对象,

..........

}

通过name属性指定对应的组件对象

<router-view name=" "></router-view>

    <style>
        *{
            padding:0;
            margin:0;
        }
        /*设置组件中的样式*/
        .header {
            background-color: orange;
            height: 100px;
        }
        .container {
            display: flex;
            height:700px;
        }
        .left{
            flex: 2;
            background-color: red;
        }
        .main{
            background-color: green;
            flex:8;
        }
    </style>
<div class="app">
    <!--通过name指定components中对应的组件-->
    <router-view></router-view>
    <div class="container">
        <router-view name="left"></router-view>
        <router-view name="main"></router-view>
    </div>

</div>
<script>

    /*创建组件对象*/
    var header = {
        template: '<h1 class="header">头部</h1>'
    }
    var leftBox = {
        template: '<h1 class="left">左侧导航栏</h1>'
    }
    var mainBox = {
        template: '<h1 class="main">主体内容</h1>'
    }

    var router = new VueRouter({
        routes: [
            /*使用components是一个对象,定义多个展示router-view视图,通过属性名称给router-view标签元素指定name*/
            {
                path: '/', components: {
                default: header,
                left: leftBox,
                main: mainBox
            }
            }
        ]
    })

    var vm = new Vue({
        el: '.app',
        data: {},
        router
    })
</script>

keep-alive:保存组件状态,失活的组件将会被缓存

当一个页面离开,再回到这个页面时,默认是不会保存之前页面的状态的

如果要保存这个数据 可使用<keep-alive>标签包裹住<router-view>标签

可见,当使用keep-alive标签时,已经对组件状态有所缓存,离开关于界面再次进入关于界面依然是展示西游的信息。而不是三国

当且仅当使用keep-alive时会触发两个生命周期函数 activated(keep-alive被激活) 和 deactivated(keep-alive被停用)

 

keep-alive的属性:

  1. include - 字符串或正则表达式。只有名称匹配的组件会被缓存
  2. exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。
  3. max - 数字。最多可以缓存多少组件实例。

include 和 exclude :属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。

max:最多可以缓存多少组件实例。一旦这个数字达到了,在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉。

示例代码:

app.vue

home.vue

 

about.vue

 

user.vue

示例效果:

可见,home主页没有被缓存下来


 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue RouterVue.js 官方的路由管理器,它和 Vue.js 的核心深度集成,让构建单页应用变得易如反掌。Vue Router 通过管理应用的URL,实现了组件的切换,让用户可以在单页应用享受到和传统多页应用相同的体验。 在 Vue Router ,我们可以通过 <router-view> 组件来渲染匹配到的组件。它是 Vue Router 最重要的组件之一。当我们的路由切换时,<router-view> 组件可以根据当前的 URL 自动切换到匹配到的组件,不需要手动处理。 下面是一些关于 <router-view> 组件使用的详解: 1. <router-view> 组件是函数式组件,它不会渲染出任何实际的 HTML 元素,而是渲染出匹配到的组件。 2. 每次路由切换时,<router-view> 组件会销毁旧的组件并创建新的组件实例。 3. 如果在路由配置没有指定组件的 name 属性,则默认使用默认组件。 4. 如果有多个 <router-view> 组件,需要在路由配置指定每个 <router-view> 组件应该渲染哪个组件。 5. 如果没有匹配到任何路由,则 <router-view> 组件不会渲染出任何内容。 6. 可以使用 <keep-alive> 包裹 <router-view> 组件,让路由切换时保持组件状态不被销毁。 7. 可以使用 <transition> 包裹 <router-view> 组件,为路由切换添加过渡动画效果。 总的来说,<router-view> 组件是 Vue Router 最常用的组件之一。它可以让我们在构建单页应用时轻松地管理路由和组件,为用户提供更好的体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值