403 vue路由进阶:元信息,编程式导航,导航守卫

5.1 元信息

  • **作用 **
在路由导航的时候,可以用作判断
  • 规则声明
 routes: [
     {
         path: '/header',
         component: header,
         meta: {
            title: 'XXXX'
         }
     }
 ]
  • 获取
 created() {
    document.title = this.$route.meta.title
 }

01-元信息.html

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

<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>

<body>
    <!-- 
        3个准备工作
        4个具体步骤

        元信息 : 路由里添加 meta 字段 
    -->

    <div id="app">
        <router-view></router-view>
        <h1 id="haha">哈哈</h1>
        <h1>嘿嘿</h1>
    </div>

    <script src="./vue.js"></script>
    <script src="./node_modules/vue-router/dist/vue-router.js"></script>

    <script>
        //组件
        const One = {
            template: `<div>one组件</div>`,
            created() {
                // 有了这个meta 可以做很多事情
                // console.log(this.$route.meta.title)
                // 可以设置标题
                document.title = this.$route.meta.title
                console.log(document.querySelector('#haha').innerHTML) // 哈哈 【不应该在这里操作DOM】
                console.log(111) // 111
            }
        }

        const Two = {
            template: `<div>two组件</div>`,
            created() {
                document.title = this.$route.meta.title
            }
        }

        // 实例化 + 挂载
        const router = new VueRouter({
            routes: [{
                path: '/one',
                name: 'one',
                component: One,
                meta: {
                    title: '帅气的马哥'
                }
            }, {
                path: '/two',
                name: 'two',
                component: Two,
                meta: {
                    title: '骚气的春春'
                }
            }]
        })

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

</html>


5.2 编程式导航

const one = {
    template: ` 
        <div> 
            <button @click="handleClick('back')">返回 上一页</button>
            <button @click="handleClick('push')">跳转 two页</button>
            <button @click="handleClick('replace')">替换 two页</button> 
        </div>
    `,
    methods: {
        handleClick(type) {
            if (type == 'back') {
                // 返回
                this.$router.back()
            } else if (type == 'push') {
                // 跳转 有历史记录
                this.$router.push('/two')
            } else {
                // 替换 没有历史记录
                this.$router.replace('/two')
            }
        }
    }
}
const two = {
    template: `<p>two </p>`
}

02-编程式导航.html

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

<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>

<body>
    <!-- 
      入口 
      1. 手动url修改   /one
      2. 声明式导航  <router-link to='/one'>one</router-link>

      3. 编程式导航  this.$router.push('/one')
          (1)前进(跳转) ==> 
            - this.$router.push()    - 有记录 【可以后退】
            - this.$router.replace() - 没有记录 【不可以后退】
          (2)返回   ====> this.$router.back()
    -->

    <div id="app">
        <router-view></router-view>
    </div>

    <script src="./vue.js"></script>
    <script src="./node_modules/vue-router/dist/vue-router.js"></script>
    <script>
        //组件
        const One = {
            template: `
                <div> one组件
                    <button @click="handle('push')"> 跳转到two - push </button>
                    <button @click="handle('back')"> 返回到/ </button>
                    <button @click="handle('replace')"> 跳转到two - replace </button>
                </div>`,

            methods: {
                handle(type) {
                    if (type == 'push') {
                        // $route: 路由对象,解析url信息 (属性 .path .name .meta .params)
                        // $router: VueRouter的路由实例,挂载到vue实例上后,就是$router,用于编程式导航 (方法 )
                        // push => 有记录的 【这里的push是vue的跳转,不是原生js的】
                        this.$router.push('/two')
                    } else if (type == 'back') {
                        this.$router.back()
                    } else if (type == 'replace') {
                        // replace => 没有记录的
                        this.$router.replace('/two')
                    }
                }
            }
        }

        const Two = {
            template: `<div>two组件</div>`
        }

        // 实例化 + 挂载
        const router = new VueRouter({
            routes: [{
                path: '/one',
                name: 'one',
                component: One
            }, {
                path: '/two',
                name: 'two',
                component: Two
            }]
        })

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

</html>

5.3 导航守卫

router.beforeEach((to, from, next) => {
    // 访问 login

    if (to.name == 'login') {
        // 下一步
        next()
    } else {
        // 停止跳转
        next(false)
        // 跳转到下一步
        next({ name: 'login' }) 或者 使用路径  next('/login')
    }
})

03-导航守卫.html

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

<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>

<body>
    <!-- 
        导航守卫   : 是通过跳转或者取消的方式守卫导航   A => 导航守卫 =>  B

        需求 : 所有的页面经过登录 之后才准访问
            1.  =>  login   可以
            2.  =>  one    =>  访问login => 登录之后 => one

        前置导航守卫   beforeEach   
        概念 :  是通过跳转或者取消的方式守卫导航   拦截
        1. 写法  router.beforeEach( (to,from ,next)=> {} )
        2. to : 目标路由对象  from : 来源路由对象  next: 下一步
        3. next() 允许下一步
            next(false) 不允许
            next('/login')  跳转到login    
    -->

    <div id="app">
        <router-view></router-view>
    </div>

    <script src="./vue.js"></script>
    <script src="./node_modules/vue-router/dist/vue-router.js"></script>

    <script>
        //组件
        const One = {
            template: `<div>one组件</div>`
        }
        const Login = {
            template: `<div>Login组件</div>`
        }

        // 实例化 + 挂载
        const router = new VueRouter({
            routes: [{
                path: '/one',
                name: 'one',
                component: One
            }, {
                path: '/login',
                name: 'login',
                component: Login
            }]
        })

        // 导航守卫
        // /one => /login
        // to : 目标路由对象($route)
        // from : 来源路由对象
        // next()  下一步
        router.beforeEach((to, from, next) => {
            // console.log('from:', from)
            console.log('to:', to)

            // 如果访问 login => 允许访问  next
            if (to.name == 'login') {
                next() //  next()中不用传递路径 '/login',否则会无限循环,直到报错。
            } else if (to.name == 'one') {
                next()
            } else {
                next(false); // 不允许访问  next(false)
                // next('/login'); // 如果不是login => 转到 login
                // next({ name: 'login' })
            }
        })

        const vm = new Vue({
            router, // 挂载
            el: '//app',
            data: {}
        })
    </script>
</body>

</html>

--

posted on 2020-03-21 16:01  冲啊!  阅读(514)  评论(0编辑  收藏  举报

导航