Vue如何在登录后重定向用户到主要组件

Posted

技术标签:

【中文标题】Vue如何在登录后重定向用户到主要组件【英文标题】:Vue how to redirect user after login to main components 【发布时间】:2020-07-31 09:29:17 【问题描述】:

我刚开始学习Vue,我不明白如何制作组件的“结构”,我的意思是:我的登录页面应该作为主要组件,在应用程序中作为第一页加载,然后在成功登录后用户应该被重定向到主要组件(核心应用程序)。

有人可以简单地解释一下如何做到这一点吗? App.vue 中应该有什么?在哪里放置负责登录视图的路由器视图以及在哪里放置负责登录后可以显示的视图的路由器视图?

这是我的几段代码:

App.vue

<template> 
    <div>

      <left-menu></left-menu>
      <nav-menu></nav-menu>
      <router-view></router-view>

    </div>

</template>

<script>
import NavMenu from './NavMenu.vue';
import LeftMenu from './LeftMenu.vue';


export default 
  components: 
    navMenu: NavMenu,
    leftMenu: LeftMenu
  ,
  computed: 
      auth() 
          return this.$store.getters.isAuthenticated;
      
  

</script>

那是我的 routes.js,每个组件都有相同的结构: (基本上应该在登录后加载特定组件)


        path: '/orders', 
        component: Orders, 
        beforeEnter(to, from, next) 
            if (store.state.jwt) 
                next();
             else 
                next('/login')
            
        
    

这是我的登录组件:

<template>
    <div class="login-content">

        <form @submit.prevent="submit">
            <label>Podaj login</label>
            <input type="text" v-model="login">

            <br>

            <label>Podaj hasło</label>
            <input type="password" v-model="password">

            <button type="submit">Zaloguj</button>

        </form>
    </div>
</template>

<script>

export default 
    data() 
        return 
            login: '',
            password: ''
        
    ,
    methods: 
        submit() 
            const formData = 
                login: this.login,
                password: this.password
            
            this.$store.dispatch('login', 
                login: formData.login,
                password: formData.password
            )
        
    

使用这些设置,我的登录组件会在用户未通过身份验证时加载,但内容会出现在登录前不应该看到的组件上。

我见过Redirect to requested page after login using vue-router,但我不明白。

【问题讨论】:

“内容出现”是什么意思?如果有登录重定向,您什么时候会看到其他组件上的内容? 【参考方案1】:

登录成功后重定向到首页可以在方法本身中完成。

    submit() 
        const formData = 
            login: this.login,
            password: this.password
        
        this.$store.dispatch('login', formData)
          .then(response=>
              if(response.data.status)
                 this.$router.push(name:'home')
              
          )
    

现在您需要处理对login 页面的访问。我通过将 meta 值添加到 router 对象来管理此问题。


    name: 'login',
    path: '/login',
    component: Login,
    meta: 
        public: true,
        disableIfLoggedIn: true
    
,
public :如果此值设置为true 则无需认证即可访问此页面。 disableIfLoggedIn:如果此值设置为true,则页面一旦通过身份验证就无法访问。

检查这些值并在beforeEach 部分管理重定向,如下所示

router.beforeEach((to, from, next) => 
    // if the route is not public
    if (!to.meta.public) 
        // if the user authenticated
        if (store.getters.isAuthenticated) 
            // continue to the route
            next();
         else 
            // set redirect to path after login
            let redirect = ;
            if (to.name !== 'home') 
                redirect = redirect: to.path;
            
            // redirect to login
            next(name: 'login', query: redirect);
        
    
    // if the user is authenticated and the route is disabled for authenticated window
    if (store.getters.isAuthenticated && to.meta.disableIfLoggedIn) 
        // redirect to home
        next(name: 'home');
    
    next();
);

这将在每个路由器导航之前检查并控制对路由的访问。

注意

可以删除重定向部分。这是为了在登录后处理重定向到特定路径。

【讨论】:

以上是关于Vue如何在登录后重定向用户到主要组件的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中登录后重定向特定页面

如何在登录后重定向到我想要的页面并在成功登录后显示用户名

如何在您的登录 api 的 Json 响应后重定向用户反应本机

Laravel 护照和 Vue 登录

Laravel 5.5登录后重定向到特定路由

使用 Spring Security 登录后重定向到不同的页面