当前位置:首页 > VUE

用vue实现登录

2026-01-18 23:38:01VUE

实现登录功能的基本步骤

在Vue中实现登录功能通常需要结合前端和后端交互,以下是一个基于Vue 3和axios的典型实现方案。

创建登录表单组件

在Vue组件中构建登录表单,包含用户名和密码输入框以及提交按钮。

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

<script>
export default {
  data() {
    return {
      username: '',
      password: ''
    }
  }
}
</script>

处理登录逻辑

添加登录方法,通过axios向后端API发送请求。

<script>
import axios from 'axios'

export default {
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    async handleLogin() {
      try {
        const response = await axios.post('/api/login', {
          username: this.username,
          password: this.password
        })

        // 处理登录成功后的逻辑
        localStorage.setItem('token', response.data.token)
        this.$router.push('/dashboard')
      } catch (error) {
        alert('登录失败: ' + error.response.data.message)
      }
    }
  }
}
</script>

添加表单验证

使用Vuelidate或其他验证库增强表单验证。

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

export default {
  data() {
    return {
      username: '',
      password: ''
    }
  },
  validations: {
    username: { required },
    password: { required, minLength: minLength(6) }
  },
  methods: {
    handleLogin() {
      this.$v.$touch()
      if (this.$v.$invalid) {
        alert('请填写正确的表单信息')
        return
      }
      // 继续登录逻辑
    }
  }
}

路由保护

使用Vue Router的导航守卫保护需要登录的页面。

// 在router/index.js中
router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')
  if (to.meta.requiresAuth && !isAuthenticated) {
    next('/login')
  } else {
    next()
  }
})

状态管理

对于更复杂的应用,可以使用Vuex或Pinia管理登录状态。

// 使用Pinia示例
import { defineStore } from 'pinia'

export const useAuthStore = defineStore('auth', {
  state: () => ({
    token: localStorage.getItem('token') || null,
    user: null
  }),
  actions: {
    async login(credentials) {
      const response = await axios.post('/api/login', credentials)
      this.token = response.data.token
      localStorage.setItem('token', this.token)
    },
    logout() {
      this.token = null
      localStorage.removeItem('token')
    }
  }
})

错误处理和加载状态

添加加载状态和更好的错误处理提升用户体验。

用vue实现登录

methods: {
  async handleLogin() {
    this.loading = true
    this.error = null

    try {
      await this.authStore.login({
        username: this.username,
        password: this.password
      })
      this.$router.push('/dashboard')
    } catch (error) {
      this.error = error.response?.data?.message || '登录失败'
    } finally {
      this.loading = false
    }
  }
}

完整组件示例

<template>
  <form @submit.prevent="handleLogin">
    <div v-if="error" class="error">{{ error }}</div>
    <div>
      <label for="username">用户名</label>
      <input 
        id="username" 
        v-model="username" 
        type="text" 
        required
        :disabled="loading"
      >
    </div>
    <div>
      <label for="password">密码</label>
      <input 
        id="password" 
        v-model="password" 
        type="password" 
        required
        :disabled="loading"
      >
    </div>
    <button type="submit" :disabled="loading">
      {{ loading ? '登录中...' : '登录' }}
    </button>
  </form>
</template>

<script>
import { mapActions } from 'pinia'
import { useAuthStore } from '@/stores/auth'

export default {
  data() {
    return {
      username: '',
      password: '',
      loading: false,
      error: null
    }
  },
  methods: {
    ...mapActions(useAuthStore, ['login']),
    async handleLogin() {
      this.loading = true
      this.error = null

      try {
        await this.login({
          username: this.username,
          password: this.password
        })
        this.$router.push('/dashboard')
      } catch (error) {
        this.error = error.response?.data?.message || '登录失败'
      } finally {
        this.loading = false
      }
    }
  }
}
</script>

标签: vue
分享给朋友:

相关文章

vue实现表白

vue实现表白

Vue 实现表白页面 使用 Vue 可以快速创建一个动态、交互式的表白页面。以下是一个简单的实现方案: 基础结构 创建一个 Vue 项目或单文件组件,包含以下核心部分: <template&…

vue 实现视频

vue 实现视频

Vue 实现视频播放功能 使用 Vue 实现视频播放功能可以通过 HTML5 的 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见的方法: 使用 HTML5…

vue实现双向

vue实现双向

Vue 实现双向绑定的方法 Vue 的双向绑定主要通过 v-model 指令实现,它结合了数据绑定和事件监听,适用于表单元素(如 input、select、textarea 等)。以下是几种常见的实现…

vue for实现

vue for实现

Vue 中的 v-for 指令 v-for 是 Vue.js 中用于渲染列表数据的核心指令,通过遍历数组或对象生成动态内容。 基本语法(数组) <ul> <li v-for…

vue递归实现

vue递归实现

vue递归实现方法 在Vue中实现递归组件通常用于树形结构、嵌套菜单等场景。以下是具体实现方式: 使用组件name属性递归 定义一个组件时,通过name属性让组件可以在自身模板中调用自己:…

vue搜索功能实现

vue搜索功能实现

Vue搜索功能实现方法 在Vue中实现搜索功能可以通过多种方式完成,以下是几种常见的方法: 使用计算属性实现搜索 计算属性非常适合处理需要根据输入值动态过滤数据的情况。创建一个计算属性,根据搜索关键…