导航守卫beforeEach

beforeEach

<!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>
</head>

<body>
    <div id="app">
        <router-view />
    </div>
    <script src="./vue.min.js"></script>
    <script src="./vue-router.js"></script>
    <script>
        //可以进的地方 家 公园 
        // 不可以进的地方 动物园 当没有买票进的话要买票入场 
        // 动物园里面包括老虎区 进入老虎区需要门票进入 没有门票拦截
        // meta可以包裹任意自定义信息 
        // 售票处有一个按钮进行买票 当点击买票 购买成功的话返回你自己停留的页面
        // 买票成功后记录在本地当中 进行系统读取 查看是否已经买票成功 如果有的话放行 没有的话重新买票
        const Home = {
            template: `
          <div>这是我家
          <router-link to="/park">公园</router-link>
          <router-link to="/zoo">动物园</router-link>
          <router-link to="/movie">电影院</router-link>
          <router-link to="/zoo/tiger">动物园的老虎区</router-link>
          </div>
          `
        }
        const Park = {
            template: `
            <div>公园</div>
            `
        }
        const Zoo = {
            template: `
            <div>动物园
                <router-view/>
                </div>
            `
        }
        const Ticket = {
            template: `
            <div>售票区
            <button @click="buy">买票</button>
                </div>
            `,
            methods: {
                buy() {
                    //让其买票成功后直接储存在本地当中
                    localStorage.setItem('ticket', true)
                    // 买完跳转为首页
                    // this.$router.push('/')
                    // 这个是获取要买票前的位置或者返回为首页
                    const a = this.$route.query.a || "/"
                    this.$router.push(a)
                }
            }
        }
        const Movie = {
            template: `
            <div>电影区</div>
            `
        }
        const Tiger = {
            template: `
            <div>老虎区</div>
            `
        }
        const routes = [
            {
                path: '/',//默认显示的页面
                component: Home
            },
            {
                path: '/park',
                component: Park
            },
            {
                path: '/zoo',
                component: Zoo,
                meta: {
                    // 定义meta包裹任意自定义元素
                    auto: true
                },
                children: [
                    {
                        path: '/zoo/tiger',
                        component: Tiger
                    }
                ]
            },
            {
                path: '/ticket',
                component: Ticket
            },
            {
                path: '/movie',
                component: Movie,
                meta: {
                    auto: true
                }
            }
        ]
        const router = new VueRouter({
            routes
        })
        // 全局前置守卫 对路由跳转进行拦截
        // 导航守卫有3个参数 
        // to:进入到哪个路由去
        // from:从哪个路由离开
        // next:(放行) 路由的控制参数,常用的有next(true)和next(false) 
        router.beforeEach((to, from, next) => {
            // if (to.path == '/zoo' || to.path == '/movie')  = = if (to.meta.auto) 都是当需要门票的时候进行拦截
            // console.log(to,from) 打印出 matched里面包含父及所有的一切 

            if (to.matched.some(route => route.meta.auto)) {
                //这样写的意思是当路由当中包含包裹自定义元素的时候 进行match拦截所有
                // some当匹配一些是true其他的全是TRUE 当一个父拦截里面的子也拦截不必重新搞meta 直接使用matched来进行搞
                //给每个要进行买票的后面包裹一个meta 使用判断语句进行控制参数


                //查看是否已经买票成功 如果有的话放行 没有的话重新买票
                if (localStorage.getItem('ticket')) {
                    next()
                }
                else {
                    // 这个是进入控制台显示进入的路由地址后面?是拼接自定义的参数
                    next('/ticket?a=' + to.path)
                    // next('/ticket')
                }
                }
             else {
                next()
            }
        })
        var vm = new Vue({
            el: '#app',
            router,
            data: {},
            methods: {}
        });
    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值