当前位置:首页 > VUE

vue3 登录实现

2026-01-20 01:23:43VUE

Vue3 登录实现

创建登录表单组件

使用 Vue3 的 Composition API 创建一个登录表单组件,包含用户名和密码输入框。

<template>
  <form @submit.prevent="handleSubmit">
    <input v-model="form.username" type="text" placeholder="用户名" />
    <input v-model="form.password" type="password" placeholder="密码" />
    <button type="submit">登录</button>
  </form>
</template>

<script setup>
import { reactive } from 'vue';

const form = reactive({
  username: '',
  password: ''
});

const handleSubmit = () => {
  console.log('提交登录表单', form);
};
</script>

添加表单验证

使用第三方库如 vee-validate 或自定义验证逻辑来确保输入的有效性。

<template>
  <form @submit.prevent="handleSubmit">
    <input 
      v-model="form.username" 
      type="text" 
      placeholder="用户名" 
      :class="{ 'error': errors.username }"
    />
    <span v-if="errors.username">{{ errors.username }}</span>

    <input 
      v-model="form.password" 
      type="password" 
      placeholder="密码" 
      :class="{ 'error': errors.password }"
    />
    <span v-if="errors.password">{{ errors.password }}</span>

    <button type="submit">登录</button>
  </form>
</template>

<script setup>
import { reactive } from 'vue';

const form = reactive({
  username: '',
  password: ''
});

const errors = reactive({
  username: '',
  password: ''
});

const validateForm = () => {
  let isValid = true;
  if (!form.username) {
    errors.username = '用户名不能为空';
    isValid = false;
  }
  if (!form.password) {
    errors.password = '密码不能为空';
    isValid = false;
  }
  return isValid;
};

const handleSubmit = () => {
  if (validateForm()) {
    console.log('表单验证通过', form);
  }
};
</script>

调用登录接口

使用 axiosfetch 发送登录请求到后端 API。

vue3 登录实现

<script setup>
import { reactive } from 'vue';
import axios from 'axios';

const form = reactive({
  username: '',
  password: ''
});

const handleSubmit = async () => {
  try {
    const response = await axios.post('/api/login', form);
    console.log('登录成功', response.data);
  } catch (error) {
    console.error('登录失败', error.response.data);
  }
};
</script>

处理登录状态

使用 Vuex 或 Pinia 管理登录状态,并在登录成功后跳转到主页。

<script setup>
import { reactive } from 'vue';
import { useRouter } from 'vue-router';
import { useAuthStore } from '@/stores/auth';

const form = reactive({
  username: '',
  password: ''
});

const router = useRouter();
const authStore = useAuthStore();

const handleSubmit = async () => {
  try {
    const response = await axios.post('/api/login', form);
    authStore.setUser(response.data.user);
    router.push('/');
  } catch (error) {
    console.error('登录失败', error.response.data);
  }
};
</script>

添加加载状态

在登录过程中显示加载状态,避免用户重复提交。

vue3 登录实现

<template>
  <form @submit.prevent="handleSubmit">
    <input v-model="form.username" type="text" placeholder="用户名" />
    <input v-model="form.password" type="password" placeholder="密码" />
    <button type="submit" :disabled="isLoading">
      {{ isLoading ? '登录中...' : '登录' }}
    </button>
  </form>
</template>

<script setup>
import { reactive, ref } from 'vue';

const form = reactive({
  username: '',
  password: ''
});

const isLoading = ref(false);

const handleSubmit = async () => {
  isLoading.value = true;
  try {
    const response = await axios.post('/api/login', form);
    console.log('登录成功', response.data);
  } catch (error) {
    console.error('登录失败', error.response.data);
  } finally {
    isLoading.value = false;
  }
};
</script>

持久化登录状态

使用 localStoragesessionStorage 持久化登录状态,避免页面刷新后丢失。

<script setup>
import { reactive } from 'vue';
import { useRouter } from 'vue-router';
import { useAuthStore } from '@/stores/auth';

const form = reactive({
  username: '',
  password: ''
});

const router = useRouter();
const authStore = useAuthStore();

const handleSubmit = async () => {
  try {
    const response = await axios.post('/api/login', form);
    authStore.setUser(response.data.user);
    localStorage.setItem('token', response.data.token);
    router.push('/');
  } catch (error) {
    console.error('登录失败', error.response.data);
  }
};
</script>

路由守卫

在路由守卫中检查登录状态,未登录用户跳转到登录页。

import { createRouter, createWebHistory } from 'vue-router';
import { useAuthStore } from '@/stores/auth';

const routes = [
  { path: '/', component: Home, meta: { requiresAuth: true } },
  { path: '/login', component: Login }
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

router.beforeEach((to, from, next) => {
  const authStore = useAuthStore();
  if (to.meta.requiresAuth && !authStore.isAuthenticated) {
    next('/login');
  } else {
    next();
  }
});

错误提示

在登录失败时显示错误提示,增强用户体验。

<template>
  <form @submit.prevent="handleSubmit">
    <input v-model="form.username" type="text" placeholder="用户名" />
    <input v-model="form.password" type="password" placeholder="密码" />
    <button type="submit">登录</button>
    <p v-if="errorMessage" class="error">{{ errorMessage }}</p>
  </form>
</template>

<script setup>
import { reactive, ref } from 'vue';

const form = reactive({
  username: '',
  password: ''
});

const errorMessage = ref('');

const handleSubmit = async () => {
  try {
    const response = await axios.post('/api/login', form);
    console.log('登录成功', response.data);
  } catch (error) {
    errorMessage.value = error.response.data.message || '登录失败';
  }
};
</script>

分享给朋友:

相关文章

vue实现生成二维码

vue实现生成二维码

使用qrcode.vue库生成二维码 安装qrcode.vue库: npm install qrcode.vue --save 在Vue组件中使用: <template> <…

vue实现缩放

vue实现缩放

Vue 实现缩放的方法 在 Vue 中实现缩放功能可以通过多种方式完成,以下是一些常见的方法: 使用 CSS transform 属性 通过 CSS 的 transform: scale() 属性可…

vue的实现

vue的实现

Vue 的实现原理 Vue 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 实现的主要技术细节。 响应式系统 Vue 的响…

vue实现骰子

vue实现骰子

Vue 实现骰子功能 创建 Vue 组件 在 Vue 项目中创建一个骰子组件,例如 Dice.vue。该组件包含骰子的外观和逻辑。 <template> <div class=…

vue实现机制

vue实现机制

Vue 实现机制的核心原理 Vue.js 的核心实现机制主要基于响应式系统、虚拟 DOM 和组件化设计。以下是关键实现细节: 响应式系统 Vue 通过 Object.defineProperty(V…

vue 实现全屏

vue 实现全屏

Vue 实现全屏功能 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 完成。以下是一个完整的实现方案: 安装依赖(可选) 如果需要跨浏览器兼容性更好,可以安装…