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

Laravel Inertia Vue表单加载状态在非提交按钮点击时异常触发

问题:点击Register链接时登录按钮的加载Spinner异常触发

我在Vue.js应用中实现了一个登录表单,点击提交按钮时会触发加载spinner,但点击表单外的“Register”链接时,即使未点击提交按钮,加载spinner也会出现。相关代码如下:

脚本代码

<script setup>
import { reactive } from 'vue'
import { router } from '@inertiajs/vue3'

defineProps({ errors: Object })

const form = reactive({
  email: null,
  password: null, 
  remember: null,
  loading: false
})
 
function submit() {  
    router.post('/login', form) 
}
router.on('start', () => {
  form.loading = true
})

router.on('finish', () => {
  form.loading = false
})
</script>

HTML代码

<form @submit.prevent="submit" action="post">
   <h5>Login </h5>
   <input v-model="form.email" type="text" ><label>Email</label>  
   <input v-model="form.password" type="password" ><label>Password</label>
   <button :class="form.loading ? 'spinner' : ''" type="submit" >{{form.loading ? "Processing..." : 'Login' }}</button>
</form> 
<Link href="/register"> Register </Link>
<Link href="/home" ><i>home</i></Link>

原因分析

当前代码通过router.on('start')全局监听Inertia的所有请求开始事件——不管是登录提交的POST请求,还是点击Register、Home链接触发的页面跳转请求,都会触发这个回调并将form.loading设为true,导致登录按钮的加载状态被错误激活。

解决方案

移除全局的router事件监听,改为仅在登录提交的流程中单独控制loading状态,这样只有点击登录按钮时才会触发加载状态:

修改后的脚本代码:

<script setup>
import { reactive } from 'vue'
import { router } from '@inertiajs/vue3'

defineProps({ errors: Object })

const form = reactive({
  email: null,
  password: null, 
  remember: null,
  loading: false
})
 
async function submit() {  
    // 提交前开启加载状态
    form.loading = true
    try {
        // 发送登录请求
        await router.post('/login', form)
    } finally {
        // 请求结束(成功/失败)后关闭加载状态
        form.loading = false
    }
}
</script>

这样修改后,只有点击登录提交按钮时,才会设置form.loading为true,点击其他链接的页面跳转不会影响登录按钮的状态。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:45:28