当前位置:首页 > VUE

vue 实现登录

2026-03-07 09:14:47VUE

Vue 实现登录功能

在 Vue 中实现登录功能通常需要结合前端表单验证、后端 API 调用以及状态管理。以下是一个完整的实现方案:

创建登录组件

<template>
  <div class="login-container">
    <form @submit.prevent="handleSubmit">
      <div class="form-group">
        <label for="username">用户名</label>
        <input 
          type="text" 
          id="username" 
          v-model="form.username" 
          required
        >
      </div>
      <div class="form-group">
        <label for="password">密码</label>
        <input 
          type="password" 
          id="password" 
          v-model="form.password" 
          required
        >
      </div>
      <button type="submit">登录</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      form: {
        username: '',
        password: ''
      }
    }
  },
  methods: {
    async handleSubmit() {
      try {
        const response = await this.$axios.post('/api/login', this.form)
        localStorage.setItem('token', response.data.token)
        this.$router.push('/dashboard')
      } catch (error) {
        console.error('登录失败:', error)
      }
    }
  }
}
</script>

设置 Axios 拦截器

main.js 或单独的文件中配置 Axios 拦截器,处理请求和响应:

vue 实现登录

import axios from 'axios'

const instance = axios.create({
  baseURL: 'http://your-api-domain.com'
})

instance.interceptors.request.use(config => {
  const token = localStorage.getItem('token')
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

instance.interceptors.response.use(response => {
  return response
}, error => {
  if (error.response.status === 401) {
    // 处理未授权情况
    localStorage.removeItem('token')
    router.push('/login')
  }
  return Promise.reject(error)
})

Vue.prototype.$axios = instance

路由守卫配置

router.js 中配置路由守卫,保护需要认证的路由:

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

const router = new Router({
  routes: [
    {
      path: '/login',
      component: () => import('./views/Login.vue')
    },
    {
      path: '/dashboard',
      component: () => import('./views/Dashboard.vue'),
      meta: { requiresAuth: true }
    }
  ]
})

router.beforeEach((to, from, next) => {
  const token = localStorage.getItem('token')
  if (to.matched.some(record => record.meta.requiresAuth) && !token) {
    next('/login')
  } else {
    next()
  }
})

export default router

状态管理 (Vuex)

store.js 中配置用户状态管理:

vue 实现登录

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user: null,
    isAuthenticated: false
  },
  mutations: {
    setUser(state, user) {
      state.user = user
      state.isAuthenticated = true
    },
    logout(state) {
      state.user = null
      state.isAuthenticated = false
    }
  },
  actions: {
    login({ commit }, userData) {
      return new Promise((resolve, reject) => {
        // 这里调用API
        commit('setUser', userData)
        resolve()
      })
    },
    logout({ commit }) {
      commit('logout')
      localStorage.removeItem('token')
    }
  }
})

表单验证增强

可以使用 Vuelidate 进行更复杂的表单验证:

import { required, minLength } from 'vuelidate/lib/validators'

export default {
  data() {
    return {
      form: {
        username: '',
        password: ''
      }
    }
  },
  validations: {
    form: {
      username: { required },
      password: { required, minLength: minLength(6) }
    }
  },
  methods: {
    handleSubmit() {
      this.$v.$touch()
      if (!this.$v.$invalid) {
        // 提交表单
      }
    }
  }
}

错误处理增强

在登录方法中添加更完善的错误处理:

methods: {
  async handleSubmit() {
    try {
      const response = await this.$axios.post('/api/login', this.form)
      localStorage.setItem('token', response.data.token)
      this.$store.dispatch('login', response.data.user)
      this.$router.push('/dashboard')
    } catch (error) {
      if (error.response) {
        switch (error.response.status) {
          case 401:
            this.error = '用户名或密码错误'
            break
          case 500:
            this.error = '服务器错误,请稍后再试'
            break
          default:
            this.error = '登录失败'
        }
      } else {
        this.error = '网络错误,请检查连接'
      }
    }
  }
}

以上方案提供了 Vue 中实现登录功能的完整流程,包括表单处理、API 调用、状态管理和路由保护等关键环节。根据实际项目需求,可以进一步调整和扩展这些基础实现。

标签: vue
分享给朋友:

相关文章

vue 实现简单登陆

vue 实现简单登陆

以下是一个使用 Vue 3 实现的简单登录功能示例,包含表单验证和基础交互逻辑: 创建 Vue 组件 <template> <div class="login-contai…

vue实现app

vue实现app

Vue 实现 App 的常见方法 使用 Vue 开发移动端 App 主要有两种主流方案:混合开发(Hybrid)和原生渲染。以下是具体实现方式和工具链: 混合开发方案(WebView 嵌入) 通过…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &l…

vue实现通知

vue实现通知

Vue 实现通知功能的方法 使用 Vue 实现通知功能可以通过多种方式实现,以下是一些常见的方法: 使用 Vue 的全局事件总线 在 Vue 中可以通过事件总线实现通知功能。创建一个全局事件总线,然…

vue实现计算

vue实现计算

Vue 实现计算的方法 在 Vue 中实现计算功能可以通过多种方式完成,主要包括计算属性(computed)、方法(methods)和侦听器(watch)。以下是具体的实现方法: 计算属性(Comp…

vue实现翻页

vue实现翻页

Vue实现翻页功能 在Vue中实现翻页功能通常需要结合分页组件和数据请求逻辑。以下是常见的实现方法: 使用Element UI分页组件 安装Element UI后,可以直接使用其分页组件:…