如何阻止vue组件不调用已挂载的

时间:2018-03-06 14:22:51

标签: vue.js vuejs2 vue-router vuex

这是我的mixin

export default {
  created () {
    if (!this.$store.getters.isAuthenticated) {
      this.$router.replace('/start')
    }
  }
}

这是我的组成部分: -

import Auth from '../auth'

export default {
  mixins: [Auth],
  computed: {
    orders () {
      return this.$store.getters.orders
    }
  },
  mounted () {
    this.$store.dispatch('getOrders')
  }
}

商店: -

async getOrders ({ commit, state }) {
  const res = await axios.get(`${API_URL}/orders`, {
    headers: {
      'authorization': state.currentUser.token
    }
  })
  commit('setOrders', res.data)
}

我遇到的问题是,虽然当我转到'/start'时它确实重定向到'/orders',但它也开始从mounted挂钩获取订单,并且从{{1如果为currentUser,则TypeErrorCannot read property 'token' of null。虽然我可以通过检查是否设置getOrders来保护currentUser函数,但是我必须在许多其他函数中执行此操作。我想要发生的是,created挂钩不应该被调用或任何其他任何人都知道更好的技术?

2 个答案:

答案 0 :(得分:0)

你可以使用路由功能beforeRouteEnter,如果app没有被authed,你可以在进入页面之前重定向到其他页面需要auth

答案 1 :(得分:0)

使用global navigation guards进行身份验证,而不是检查用户。

您可以使用beforeEachbeforeResolve来检查currentUser是否为空。

  import store from './store'; // import your Vuex store

  const router = new VueRouter({
    routes: [{
      name: 'orders',
      path: '/orders',
      meta: {
        requiresAuth: true // use this in the routes that need your currentUser
      }
    }],
  });

  router.beforeResolve((to, from, next) => {
    if (to.matched.some(record => record.meta.requiresAuth)) {
      if (!this.$store.getters.isAuthenticated || !store.state.currentUser) {
        next({
          name: 'forbidden' // the route the guest will be redirected to
        });
      } else {
        next();
      }
    } else {
      next();
    }
  });

  export default router;