当前位置:首页 > VUE

vue路由实现登录注册

2026-01-21 02:05:58VUE

Vue路由实现登录注册功能

路由配置

在Vue项目中,通过vue-router配置登录和注册的路由。通常将这些路由设置为公开可访问,不要求认证。

// router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/views/Login.vue'
import Register from '@/views/Register.vue'
import Dashboard from '@/views/Dashboard.vue'

Vue.use(Router)

const router = new Router({
  routes: [
    {
      path: '/login',
      name: 'Login',
      component: Login
    },
    {
      path: '/register',
      name: 'Register',
      component: Register
    },
    {
      path: '/dashboard',
      name: 'Dashboard',
      component: Dashboard,
      meta: { requiresAuth: true }
    }
  ]
})

导航守卫

使用路由守卫保护需要认证的页面,未登录用户尝试访问受保护路由时重定向到登录页。

// 添加全局前置守卫
router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')

  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!isAuthenticated) {
      next({ name: 'Login' })
    } else {
      next()
    }
  } else {
    next()
  }
})

登录组件实现

创建登录表单组件,处理用户提交的凭证。

<!-- views/Login.vue -->
<template>
  <div>
    <form @submit.prevent="handleLogin">
      <input v-model="email" type="email" placeholder="Email" required>
      <input v-model="password" type="password" placeholder="Password" required>
      <button type="submit">Login</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      email: '',
      password: ''
    }
  },
  methods: {
    async handleLogin() {
      try {
        const response = await authService.login(this.email, this.password)
        localStorage.setItem('token', response.data.token)
        this.$router.push({ name: 'Dashboard' })
      } catch (error) {
        console.error('Login failed:', error)
      }
    }
  }
}
</script>

注册组件实现

创建用户注册表单组件。

<!-- views/Register.vue -->
<template>
  <div>
    <form @submit.prevent="handleRegister">
      <input v-model="name" type="text" placeholder="Name" required>
      <input v-model="email" type="email" placeholder="Email" required>
      <input v-model="password" type="password" placeholder="Password" required>
      <button type="submit">Register</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: '',
      email: '',
      password: ''
    }
  },
  methods: {
    async handleRegister() {
      try {
        await authService.register(this.name, this.email, this.password)
        this.$router.push({ name: 'Login' })
      } catch (error) {
        console.error('Registration failed:', error)
      }
    }
  }
}
</script>

认证服务

创建独立的认证服务模块处理API调用。

// services/auth.js
import axios from 'axios'

const API_URL = 'https://your-api-endpoint.com'

export default {
  login(email, password) {
    return axios.post(`${API_URL}/login`, { email, password })
  },
  register(name, email, password) {
    return axios.post(`${API_URL}/register`, { name, email, password })
  }
}

用户状态管理

对于更复杂的应用,建议使用Vuex管理用户认证状态。

// store/modules/auth.js
const state = {
  user: null,
  token: localStorage.getItem('token') || null
}

const mutations = {
  SET_USER(state, user) {
    state.user = user
  },
  SET_TOKEN(state, token) {
    state.token = token
    localStorage.setItem('token', token)
  },
  LOGOUT(state) {
    state.user = null
    state.token = null
    localStorage.removeItem('token')
  }
}

const actions = {
  login({ commit }, credentials) {
    return authService.login(credentials.email, credentials.password)
      .then(response => {
        commit('SET_TOKEN', response.data.token)
        return response
      })
  },
  register({ commit }, userData) {
    return authService.register(userData.name, userData.email, userData.password)
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

响应式导航

根据认证状态动态显示/隐藏导航菜单项。

vue路由实现登录注册

<!-- components/Navbar.vue -->
<template>
  <nav>
    <router-link to="/login" v-if="!isAuthenticated">Login</router-link>
    <router-link to="/register" v-if="!isAuthenticated">Register</router-link>
    <button @click="logout" v-if="isAuthenticated">Logout</button>
  </nav>
</template>

<script>
import { mapState, mapActions } from 'vuex'

export default {
  computed: {
    ...mapState('auth', ['token']),
    isAuthenticated() {
      return !!this.token
    }
  },
  methods: {
    ...mapActions('auth', ['logout'])
  }
}
</script>

标签: 路由vue
分享给朋友:

相关文章

vue tab实现

vue tab实现

Vue Tab 实现方法 使用动态组件实现 Tab 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现 Ta…

vue实现ajax

vue实现ajax

Vue 中实现 AJAX 的几种方法 在 Vue 中实现 AJAX 请求可以通过原生 JavaScript 的 XMLHttpRequest、第三方库如 axios 或 fetch API 来完成。以…

vue排他思想实现

vue排他思想实现

Vue 排他思想实现 排他思想在 Vue 中通常指多个元素中只能有一个被选中或激活的状态。可以通过数据驱动和条件渲染实现。 使用 v-model 和计算属性 定义一个数据属性存储当前选中项的索引或标…

vue实现数据渲染

vue实现数据渲染

Vue 数据渲染的实现方式 Vue.js 提供了多种数据渲染的方式,包括插值表达式、指令和计算属性等。以下是常见的实现方法: 插值表达式 使用双大括号 {{ }} 将数据绑定到模板中,数据变化时会自…

vue如何实现计算

vue如何实现计算

Vue 实现计算的方法 Vue 提供了多种方式来实现计算逻辑,包括计算属性、方法、侦听器等。以下是几种常见的实现方式: 计算属性(Computed Properties) 计算属性是基于它们的响应式…

vue实现特效轮播

vue实现特效轮播

Vue实现特效轮播的方法 使用Vue实现轮播效果可以通过多种方式完成,以下是几种常见的实现方法。 使用Vue和CSS动画 通过Vue的动态绑定和CSS动画结合,可以实现平滑的轮播效果。 <t…