当前位置:首页 > VUE

vue 登录页面实现

2026-02-17 00:21:48VUE

Vue 登录页面实现

创建Vue项目

使用Vue CLI创建一个新项目:

vue create login-app

选择默认配置或手动配置项目依赖。

安装必要依赖

安装路由和表单验证库(如Vuelidate):

npm install vue-router vuelidate

项目结构

典型结构如下:

src/
├── components/
│   └── LoginForm.vue
├── views/
│   └── Login.vue
├── router/
│   └── index.js
├── App.vue
└── main.js

实现登录表单组件

LoginForm.vue中创建基础表单:

<template>
  <form @submit.prevent="handleSubmit">
    <div>
      <label>Email</label>
      <input v-model="email" type="email" required>
    </div>
    <div>
      <label>Password</label>
      <input v-model="password" type="password" required>
    </div>
    <button type="submit">Login</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      email: '',
      password: ''
    }
  },
  methods: {
    handleSubmit() {
      // 处理登录逻辑
    }
  }
}
</script>

添加表单验证

使用Vuelidate进行验证:

vue 登录页面实现

<script>
import { required, email } from 'vuelidate/lib/validators'

export default {
  data() {
    return {
      email: '',
      password: ''
    }
  },
  validations: {
    email: { required, email },
    password: { required }
  },
  methods: {
    handleSubmit() {
      this.$v.$touch()
      if (!this.$v.$invalid) {
        // 验证通过,提交表单
      }
    }
  }
}
</script>

设置路由

router/index.js中配置登录路由:

import Vue from 'vue'
import Router from 'vue-router'
import Login from '../views/Login.vue'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/login',
      name: 'login',
      component: Login
    }
  ]
})

实现登录视图

views/Login.vue中使用登录表单:

<template>
  <div class="login-container">
    <h1>Login</h1>
    <LoginForm />
  </div>
</template>

<script>
import LoginForm from '@/components/LoginForm.vue'

export default {
  components: {
    LoginForm
  }
}
</script>

添加样式

为登录页面添加基本样式:

vue 登录页面实现

.login-container {
  max-width: 400px;
  margin: 0 auto;
  padding: 20px;
  border: 1px solid #ddd;
  border-radius: 5px;
}

form div {
  margin-bottom: 15px;
}

label {
  display: block;
  margin-bottom: 5px;
}

input {
  width: 100%;
  padding: 8px;
  box-sizing: border-box;
}

button {
  background: #42b983;
  color: white;
  border: none;
  padding: 10px 15px;
  border-radius: 4px;
  cursor: pointer;
}

处理登录逻辑

在登录方法中实现API调用:

methods: {
  async handleSubmit() {
    try {
      const response = await axios.post('/api/login', {
        email: this.email,
        password: this.password
      })
      // 处理成功登录
      localStorage.setItem('token', response.data.token)
      this.$router.push('/dashboard')
    } catch (error) {
      console.error('Login failed:', error)
    }
  }
}

添加状态管理(可选)

使用Vuex管理登录状态:

// store/index.js
export default new Vuex.Store({
  state: {
    user: null,
    isAuthenticated: false
  },
  mutations: {
    setUser(state, user) {
      state.user = user
      state.isAuthenticated = true
    }
  }
})

实现登录重定向

在路由守卫中检查认证状态:

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!store.state.isAuthenticated) {
      next('/login')
    } else {
      next()
    }
  } else {
    next()
  }
})

添加错误提示

在表单中显示验证错误:

<template>
  <div v-if="$v.email.$error">
    <span v-if="!$v.email.required">Email is required</span>
    <span v-if="!$v.email.email">Invalid email format</span>
  </div>
</template>

标签: 页面vue
分享给朋友:

相关文章

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue实现bootstrap

vue实现bootstrap

Vue 中集成 Bootstrap 的方法 在 Vue 项目中集成 Bootstrap 可以通过以下方式实现,涵盖样式、组件和交互功能。 安装 Bootstrap 依赖 通过 npm 或 yarn…

vue实现erp

vue实现erp

Vue实现ERP系统的关键步骤 技术选型与架构设计 采用Vue 3 + TypeScript构建前端,搭配Pinia状态管理,Element Plus或Ant Design Vue作为UI框架。后端可…

vue实现计算

vue实现计算

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

vue实现换肤

vue实现换肤

使用 CSS 变量实现换肤 在 Vue 项目中,可以通过 CSS 变量(Custom Properties)动态切换主题色。CSS 变量可以在运行时修改,适合实现换肤功能。 定义全局 CSS 变量:…

vue实现曲线

vue实现曲线

Vue 实现曲线的方法 在 Vue 中实现曲线可以通过多种方式,包括使用 SVG、Canvas 或第三方库如 D3.js、ECharts 等。以下是几种常见的方法: 使用 SVG 绘制曲线 SVG…