在命名视图路由器下仅保护一个组件-Vue js

时间:2018-06-22 16:03:38

标签: javascript vue.js babeljs vue-router

我有一个命名的查看路线:

let routes = [
    {
        name: "home",
        path: '/',
        components: {
            default: Home,
            project: ProjectIndex
        }
    }
]

我想基于用户角色来保护“项目”路由,但是任何人都必须可以访问默认的Home。

我将其添加到ProjectIndex组件中:

beforeRouteEnter (to, from, next) {

    var user = Spark.state.user;

    if(user.current_role == 'admin' || user.current_role == 'owner'){
        next();
    }

}

但是路由器也在Home组件上执行此代码,因此Home也受此影响。

我不认为在Vue js中这么简单的事情应该这么难。

如果我console.log(to)得到路线,但没有任何信息告诉我将渲染哪个Component。我在这里撞墙。请帮忙。

2 个答案:

答案 0 :(得分:1)

  

我还将向您展示如何支持延迟加载。

//this function will do the check and import the component supporting lazy loading
//if the check does not fulfilled then the component will not imported 
function check_condition(name_component) {
    if (name_component === 'Project') { 
      const user = store.state.user

      if (user.current_role == 'admin' || user.current_role == 'owner') {
        return () => import(`@/components/${name_component}.vue`)
      }
      return
    }
    return () => import(`@/components/${name_component}.vue`)
}

export default new Router({
    routes: [
        {
            path: '/',
            name: 'home',
            components: {
                default: check_condition('Home'),
                project: check_condition('Project')
            }
        },
        {
            path: '/about',
            name: 'about',
            component: check_condition('About')
        }
    ]
})

我喜欢上述方法。当然,还有其他方法。 如果您不喜欢上面的方法,或者它不适合您的问题,则可以尝试以下方法。

说您拥有的是vuex存储状态:

state: { user: 'admin' //or visitor } 

您想在settings_button时显示admin组件,而在visitor时则不显示:

computed: {
  should_show_settings_button () {
    return this.$store.state.user === 'admin'
  }
}

<template v-if="should_show_settings_button">
  <router-view name="settings_button"></router-view>
</template>

答案 1 :(得分:0)

您只需检查to网址:

beforeRouteEnter (to, from, next) {
  if(to.pathname !== '/') {
      //yours check
  }
  else {
       next();
  }
}

或更复杂的方法是每次检查路由数组。然后,您可以按组件名称进行检查。

let routesObjects = routes.reduce((obj, route) => { obj[route.path] = route.name; return obj; }, {});

beforeRouteEnter (to, from, next) {
    let path = to.pathname;
    if(routesObjects.hasOwnProperty(to) && routesObjects[to] !== 'home') {
        //yours check
    }
    else {
         next();
    }
}

如果您有两个具有相同pathnam的组件,则可以组合一个beforeEach钩子和meta

在组件中设置meta标签

routes: [
    { name: 'home', path: '/', meta: { isHome: true } }
]

然后只需检查

router.beforeEach((to, from, next) => {
  if(to.meta.isHome !== undefined && to.meta.isHome) { next(); }
  else { //your check  }
})