Vue-router重修02

1、权限控制

例如:登录后登录前的页面不一样

借助路由元信息完成

一个示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script src="./node_modules/vue-router/dist/vue-router.js"></script>
</head>

<body>
    <div id="app">
        <!-- 声明式导航 -->
        <router-link to="/home">首页</router-link>
        <router-link to="/blog">我的博客</router-link>
        <router-link to="/login">登录</router-link>
        <!-- <router-link to="/blog">退出</router-link> -->
        <a href="javascript:void(0)" @click="clear">退出</a>
        <router-view></router-view>
    </div>
</body>

<script>
    Vue.use(VueRouter)

    let Home = {
        template: '<h1>首页内容</h1>'
    }

    let Blog = {
        template: '<h1>博客页内容</h1>'
    }

    let Login = {
        template: `<div>
        <input type="text" v-model="name">
        <input type="text" v-model="pwd">
        <input type="button" value="登录" @click="login">
        </div>`,
        data() {
            return {
                name: '',
                pwd: ''
            }
        },
        methods: {
            login() {
                localStorage.setItem('user', this.name)
                //利用编程式导航实现登陆后跳转
                this.$router.push({name:'blog'})
            }
        }
    }


    var router = new VueRouter({
        routes: [
            {
                path: '/home',
                component: Home
            },
            {
                path: '/',
                redirect: 'home'
            },
            {
                path: '/blog',
                component: Blog,
                name:'blog',
                //为未来的路由作权限控制 全局路由守卫作参照条件
                meta: {
                    //若auth为true,则用户访问该组件时需要登录
                    auth: true
                }
            },
            {
                path: '/login',
                component: Login
            }
        ]
    })

    router.beforeEach((to, from, next) => {
        if (to.meta.auth) {
            if (localStorage.getItem('user')) {
                next()//已有登录状态,放行
            } else {//需要登录
                next({ path: '/login' })//未登录,利用next重定向至登录组件
            }
        } else {
            next()//放行
        }
    })

    new Vue({
        el: '#app',
        router,
        methods:{
            clear(){
                localStorage.removeItem('user')
                this.$router.push('/login')
            }
        }
    })

</script>

</html>

2、keep-alive

1)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script src="./node_modules/vue-router/dist/vue-router.js"></script>
</head>

<body>
    <div id="app">

    </div>
</body>
<script>
    Vue.use(VueRouter)
    let Series = {
        template: `<div>付费栏目</div>`
    }
    let Topics = {
        template: `<div>砖头广场</div>`
    }

    let App = {//keep-alive将组件状态放至缓存中保存起来
        template: `<div>
        <router-link to="/series">付费栏目</router-link>
        <router-link to="/topics">砖头广场</router-link>
        <keep-alive>
        <router-view></router-view>
        </keep-alive>
        </div>`
    }

    let router=new VueRouter({
        routes:[
            {path:'/series',component:Series},
            {path:'/topics',component:Topics},
        ]
    })
    new Vue({
        el: '#app',
        template: `<App />`,
        components: {
            App
        },
        router
    })
</script>

</html>
原文地址:https://www.cnblogs.com/Tanqurey/p/10767846.html