当前位置:首页 > VUE

vue实现登陆弹窗

2026-02-24 17:01:15VUE

实现登录弹窗的基本结构

在Vue中实现登录弹窗通常需要创建一个独立的组件,通过v-modelprops控制显示/隐藏状态。以下是基础实现方式:

<template>
  <div class="login-modal" v-if="showModal">
    <div class="modal-content">
      <span class="close" @click="closeModal">&times;</span>
      <h3>用户登录</h3>
      <form @submit.prevent="handleSubmit">
        <input v-model="username" placeholder="用户名" />
        <input v-model="password" type="password" placeholder="密码" />
        <button type="submit">登录</button>
      </form>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    value: Boolean
  },
  data() {
    return {
      username: '',
      password: ''
    }
  },
  computed: {
    showModal: {
      get() { return this.value },
      set(val) { this.$emit('input', val) }
    }
  },
  methods: {
    closeModal() {
      this.showModal = false
    },
    handleSubmit() {
      // 处理登录逻辑
      console.log(this.username, this.password)
      this.closeModal()
    }
  }
}
</script>

<style scoped>
.login-modal {
  position: fixed;
  z-index: 1;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,0.4);
}

.modal-content {
  background-color: #fefefe;
  margin: 15% auto;
  padding: 20px;
  border: 1px solid #888;
  width: 80%;
  max-width: 400px;
}

.close {
  color: #aaa;
  float: right;
  font-size: 28px;
  font-weight: bold;
  cursor: pointer;
}
</style>

在父组件中使用

父组件中引入并使用登录弹窗组件:

<template>
  <div>
    <button @click="showLoginModal = true">显示登录窗口</button>
    <LoginModal v-model="showLoginModal" />
  </div>
</template>

<script>
import LoginModal from './LoginModal.vue'

export default {
  components: { LoginModal },
  data() {
    return {
      showLoginModal: false
    }
  }
}
</script>

增强功能实现

为登录弹窗添加表单验证和加载状态:

<template>
  <div class="login-modal" v-if="showModal">
    <div class="modal-content">
      <span class="close" @click="closeModal">&times;</span>
      <h3>用户登录</h3>
      <form @submit.prevent="handleSubmit">
        <div class="form-group">
          <input v-model="form.username" placeholder="用户名" />
          <span class="error" v-if="errors.username">{{ errors.username }}</span>
        </div>
        <div class="form-group">
          <input v-model="form.password" type="password" placeholder="密码" />
          <span class="error" v-if="errors.password">{{ errors.password }}</span>
        </div>
        <button type="submit" :disabled="loading">
          {{ loading ? '登录中...' : '登录' }}
        </button>
      </form>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    value: Boolean
  },
  data() {
    return {
      form: {
        username: '',
        password: ''
      },
      errors: {},
      loading: false
    }
  },
  methods: {
    validate() {
      this.errors = {}
      let isValid = true

      if (!this.form.username) {
        this.errors.username = '请输入用户名'
        isValid = false
      }

      if (!this.form.password) {
        this.errors.password = '请输入密码'
        isValid = false
      }

      return isValid
    },
    async handleSubmit() {
      if (!this.validate()) return

      this.loading = true
      try {
        await this.$store.dispatch('user/login', this.form)
        this.closeModal()
      } catch (error) {
        this.errors.form = error.message
      } finally {
        this.loading = false
      }
    }
  }
}
</script>

使用Vuex管理登录状态

结合Vuex实现全局状态管理:

// store/modules/user.js
export default {
  namespaced: true,
  state: {
    token: null,
    userInfo: null
  },
  mutations: {
    SET_TOKEN(state, token) {
      state.token = token
    },
    SET_USER_INFO(state, userInfo) {
      state.userInfo = userInfo
    }
  },
  actions: {
    async login({ commit }, credentials) {
      const response = await api.login(credentials)
      commit('SET_TOKEN', response.token)
      commit('SET_USER_INFO', response.user)
      return response
    }
  }
}

使用第三方UI库快速实现

使用Element UI等组件库可以快速实现:

<template>
  <el-dialog :visible.sync="showModal" title="登录">
    <el-form :model="form" :rules="rules" ref="form">
      <el-form-item prop="username">
        <el-input v-model="form.username" placeholder="用户名"></el-input>
      </el-form-item>
      <el-form-item prop="password">
        <el-input v-model="form.password" type="password" placeholder="密码"></el-input>
      </el-form-item>
    </el-form>
    <div slot="footer">
      <el-button @click="showModal = false">取消</el-button>
      <el-button type="primary" @click="submitForm">登录</el-button>
    </div>
  </el-dialog>
</template>

<script>
export default {
  data() {
    return {
      form: {
        username: '',
        password: ''
      },
      rules: {
        username: [
          { required: true, message: '请输入用户名', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    submitForm() {
      this.$refs.form.validate(valid => {
        if (valid) {
          // 提交表单
        }
      })
    }
  }
}
</script>

vue实现登陆弹窗

标签: vue
分享给朋友:

相关文章

computed vue 实现

computed vue 实现

computed 在 Vue 中的基本用法 Vue 的 computed 属性用于声明依赖于其他数据的计算属性。当依赖的数据变化时,计算属性会自动重新计算并缓存结果。 export defaul…

vue实现返回

vue实现返回

返回按钮功能实现 在Vue中实现返回功能通常有两种方式:使用浏览器历史记录的history.back()或结合Vue Router进行编程式导航。以下是具体实现方法: 使用浏览器API metho…

vue实现表白

vue实现表白

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

vue课程实现

vue课程实现

Vue 课程实现方案 课程内容设计 Vue课程应从基础到高级逐步展开,涵盖Vue核心概念、组件化开发、状态管理、路由、构建工具等。基础部分包括Vue实例、模板语法、计算属性和侦听器。中级部分深入组件通…

vue实现签章

vue实现签章

Vue 实现签章功能 签章功能通常包括手写签名、电子印章等。以下是基于 Vue 的实现方法: 使用 canvas 实现手写签名 安装依赖(如需要): npm install signatu…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…