vue2.x导航卫士之beforeRouteEnter/befo

2017-11-18  本文已影响0人  第八共同体

引:vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。
全局的是在router对象上定义的守卫,比如:

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  // ...
})

注意一定别忘了调用next()才能正常解析。
单个路由独享的,就是在针对个别路由定义的守卫,比如:

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

这些守卫与全局前置守卫的方法参数是一样的。
最后,详细介绍一下组件内守卫,因为这个不是那么直观地可以被理解,比如

<template>
  <div>
    <ol>
      <li v-for="arg in $route.params">我是: {{arg}}</li>
    </ol>
    <br/>
    <div v-show="paradis">我的属性有: {{$route.params}}</div>
  </div>
</template>

<script type="text/ecmascript-6">
export default {
  data () {
    return {
      paradis: false
    }
  },
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
    console.log(to)
    console.log(from)
    console.log(next)
    next(vm => {
      console.log(vm)
    })
  },
  methods: {
    paraShow () {
      this.paradis = true
    }
  }
}
</script>

<style lang="stylus" rel="stylesheet/stylus">

</style>

beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。所以在next()中定义了一个回掉,我们就可以访问组件内的属性方法了。
至于,后面两个守卫

beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
    // 别忘了调用next
  },
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }

上面的注释说的非常清晰,调用方法和beforRouteEnter是一样的

上一篇 下一篇

猜你喜欢

热点阅读