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

Laravel Inertia+Vue.js项目登录后无法自动刷新页面以显示用户信息的问题求助

Laravel Inertia+Vue.js项目登录后无法自动刷新页面以显示用户信息的问题求助

我最近在用Laravel+Inertia+Vue.js做一个项目,目前卡在登录和登出的页面更新问题上——每次登录成功后,顶部导航栏的用户名不会自动显示,得手动刷新页面才出来;登出的时候我加了location.reload()勉强解决了,但登录这块试了好几种方法都没搞定。下面是我项目里的相关代码片段,麻烦各位大佬帮我看看问题出在哪?

1. login.vue 登录组件代码

<template>
  <form @submit.prevent="login">
    <div class="lg:w-1/3 mx-auto sm:w-1/2 md:w-1/2 xl:w-1/3">
      <div>
        <label for="email" class="label">E-mail</label>
        <input v-model="form.email" type="text" id="email" class="input" />
        <div class="input-error" v-if="form.errors.email">{{form.errors.email}}</div>
      </div>
      <div class="mt-4">
        <label for="password" class="label">Password</label>
        <input v-model="form.password" type="password" id="password" class="input" />
        <div class="input-error" v-if="form.errors.password">{{form.errors.password}}</div>
      </div>
      <div class="mt-4">
        <button class="btn-primary w-full" type="submit">Login</button>
      </div>
    </div>
  </form>
</template>

<script setup>
import { useForm } from '@inertiajs/vue3';

const form = useForm({
  email: null,
  password: null,
})

const login = () => form.post(route('login.store'))
</script>

2. mainlayout.vue 主布局组件代码

<template>
  <header class="border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 w-full">
    <div class="container mx-auto">
      <nav class="p-4 flex items-center justify-between">
        <div class="text-lg font-medium">
          <Link :href="route('formation.index')">Formations</Link>
        </div>
        <div class="text-xl text-indigo-600 dark:text-indigo-200 font-bold text-center">
          <Link :href="route('formation.index')"> E-learning </Link>
        </div>
        <div>
          <div v-if="user" class="flex items-center gap-4">
            <div class="text-sm text-gray-500">{{ user.name }}</div>
            <div class="btn-primary">
              <Link :href="route('formation.create')">+ New formation</Link>
            </div>
            <div>
              <Link :href="route('logout')" method="delete" as="button" @click="logout">
                Logout
              </Link>
            </div>
          </div>
          <div v-else>
            <Link :href="route('login')">Sign-in</Link>
          </div>
        </div>
      </nav>
    </div>
  </header>
  <main class="container mx-auto p-4 w-full">
    <slot>Default</slot>
  </main>
</template>

<script setup>
import { computed } from "vue";
import { Link, usePage } from "@inertiajs/vue3";

const page = usePage();
const user = computed(() => page.props.user);

const logout = async () => {
  await fetch(route('logout'), {
    method: 'DELETE',
  });
  location.reload(); // 登出后刷新页面才能隐藏用户信息
}
</script>

3. AuthController 的 store 登录处理方法

public function store(Request $request){
    if(!Auth::attempt($request->validate([
        'email' => 'required|string|email',
        'password' => 'required|string',
    ]),true)){
        throw ValidationException::withMessages([
            'email' => 'Authentication failed'
        ]);
    };

    $request -> session() -> regenerate();

    return redirect()->intended('/formation');
}

我自己的猜测

我感觉问题应该出在Inertia的页面props更新上——登录成功后,页面的user prop没有自动更新,所以主布局里的user computed值还是null,直到刷新页面才重新获取到用户数据。但我不知道怎么让登录后自动更新这个props,不用手动刷新。

有没有大佬能指点一下?谢谢啦!

备注:内容来源于stack exchange,提问作者user20824723

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:05:28