vuex全家桶系列02-vue-动态路由匹配和路由组件复用

129 阅读1分钟

1.动态路由匹配:

  • 🍊参数<router-link :to="{name:'user',params:{id:1}}">用户1</router-link>中的params是指的参数,可以传多个参数,所以是对象。
  • 🍊接收参数:然后在User对象中可以通过{{$route.params.id}}User组件的页面上使用
//App.vue文件
<template>
<div id="app">
    <div id="nav">
        <!-- 使⽤router-link组件来导航 -->
        <!-- 通过传⼊to属性指定连接 -->
        <!-- router-link默认会被渲染成⼀个a标签 -->
        <!-- <router-link to="/">首页</router-link>
        <router-link to="/about">关于</router-link> -->
        <router-link :to="{name:'home'}">首页</router-link>
        <router-link :to="{name:'about'}">关于我</router-link>
        <router-link :to="{name:'user',params:{id:1}}">用户1</router-link>
        <router-link :to="{name:'user',params:{id:2}}">用户2</router-link>
        <!-- 路由组件的出口 -->
        <router-view></router-view>
    </div>
</div>
</template>

<style>
#app {
    font-family: Avenir, Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
}

#nav {
    padding: 30px;
}

#nav a {
    font-weight: bold;
    color: #2c3e50;
}

#nav a.router-link-exact-active {
    color: #42b983;
}
</style>

2.路由组件的复用:

🍊路由组件复用(重要):

当使⽤路由参数时,例如从 /user/1 导航到 /user/2, 原来的组件实例会被复⽤。因为两个路由都渲染同个组件,⽐起销毁再创建,复⽤则显得更加⾼效。 不过,这也意味着组件的⽣命周期钩⼦不会再被调⽤

🌵小结:路由组件的复用处理

  • 🍊使⽤watch(监测变化) $route对象,路由发生变化了,去请求后端数据,然后进行渲染页面的等后续操作
  • 🍊使用路由守卫beforeRouteUpdate:参数有3--->从哪来的from到哪去的to放行的next函数
//🌵User.vue

<template>
<div>
    <h1>我是用户路由组件{{$route.params.id}}</h1>
</div>
</template>

<script>
export default {
    created() {
        console.log('我是路由信$route', this.$route);
    },
    watch: {
        // 🍊使⽤watch(监测变化) $route对象

        // $route(to, from) {
        //     console.log('我是from', from.params.id);
        //     console.log('我是to', to.params.id);
        //    🍊这里可以送ajax请求你,请求后端数据了,然后渲染页面
        // },

    },
    //🍊路由守卫
    beforeRouteUpdate(from, to, next) {
        console.log('beformRouterUpdate的from', from);
        console.log('beformRouterUpdate的 to', to);
        //这里一定要调用next(),不然会阻塞路由的
        next();
    },
};
</script>

<style scoped>
</style>