代码之家  ›  专栏  ›  技术社区  ›  Diego Ponciano

只为名为view router-Vue js下的一个组件提供保护

  •  0
  • Diego Ponciano  · 技术社区  · 6 年前

    我有一个命名视图路径:

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

    我想根据用户角色保护“project”路由,但是默认的Home需要任何人都可以访问。

    我将此添加到ProjectIndex组件中:

    beforeRouteEnter (to, from, next) {
    
        var user = Spark.state.user;
    
        if(user.current_role == 'admin' || user.current_role == 'owner'){
            next();
        }
    
    }
    

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

    如果我 console.log(to)

    2 回复  |  直到 6 年前
        1
  •  2
  •   Roland    6 年前

    我将向您展示如何做到这一点,支持懒加载了。

    //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')
            }
        ]
    })
    

    我喜欢上面的接近。不过当然还有其他的方法。

    假设您拥有is 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>
    
        2
  •  0
  •   GONG    6 年前

    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

    在组件中标记

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

    那就检查一下

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