You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue项目如何将Store代码提取到Login.vue并处理API校验错误

Vue登录功能代码修正方案

问题1:Store与Login.vue的代码拆分逻辑

  • Store保留通用身份相关逻辑(无需提取):CSRF Cookie初始化、登录API调用、Token持久化存储、全局请求头Authorization设置、登录状态的commit更新,这部分逻辑属于全局通用的身份认证能力,放在Store中可被其他场景复用。
  • 需从Store提取到Login.vue的逻辑:路由跳转、登录成功提示、表单重置等和登录页面交互强相关的操作,该类逻辑放到页面中可以避免Store和路由、页面组件耦合,保持Store的简洁性和通用性。

问题2:校验错误抛出与页面处理方案

你修改的Store逻辑已经用到了resolve/reject,只需要把整个action包装为Promise返回,即可在Login.vue中通过异步方法拿到返回结果:

修正后完整Store代码

// src/modules/auth/store/index
export const AUTH_AUTHENTICATE = "/api/auth/authenticate";

actions: {
  [AUTH_AUTHENTICATE]: ({ commit }, loginForm) => {
    // 外层返回Promise,支持dispatch后链式调用
    return new Promise((resolve, reject) => {
      toolsApi.get("/sanctum/csrf-cookie").then(() => {
        toolsApi
          .post("/api/auth/authenticate", loginForm)
          .then(response => {
            if (response.data.status == "success") {
              const token = `Bearer ${response.data.data.token}`;
              Cookie.set("AUTH-TOKEN", token);
              toolsApi.defaults.headers.common.Authorization = Cookie.get("AUTH-TOKEN");
              commit("setLoginStatus", true);
              resolve(response.data.data);
            } else {
              // 业务逻辑错误(如账号密码错误)抛出
              reject(response.data)
            }
          })
          .catch(error => {
            // 校验错误(422状态码)等HTTP错误抛出
            reject(error.response?.data || error);
          });
      });
    })
  }
}

修正后Login.vue代码

<template>My login form is here</template>

<script>
import { AUTH_AUTHENTICATE } from "@/modules/auth/store/index";

methods: {
  async loginFormSubmit() {
    try {
      // 等待登录接口执行完成
      await this.$store.dispatch(AUTH_AUTHENTICATE, this.loginForm);
      // 登录成功后处理页面逻辑
      this.$message.success('登录成功')
      this.$router.push({ name: "dashboard.index" })
      // 可按需添加重置表单、关闭弹窗等操作
      this.loginForm = {email: '', password: ''}
    } catch (err) {
      // 捕获校验错误,绑定到表单提示
      if (err.errors) {
        Object.keys(err.errors).forEach(field => {
          this.formErrors[field] = err.errors[field][0]
        })
        this.$message.error(err.message || '登录失败,请检查输入信息')
      }
    }
  }
}
</script>

内容的提问来源于stack exchange,提问作者Channaveer Hakari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:54:04