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

Vue3 Composition API:JWT保存后调用myUser查询的实现疑问

Vue Apollo:登录成功保存JWT后执行myUser查询

问题背景

刚接触Vue及相关技术,已实现登录后保存JWT令牌的功能,但不清楚如何在loginUser mutation执行完成后触发myUser查询。曾尝试监听loggedIn ref但未解决,现寻求可行方案。

解决方案

利用@vue/apollo-composable提供的useQuery,有两种直接可行的方式实现需求:

方式1:手动触发查询(主动调用refetch)

在setup中初始化useQuery时禁用自动执行,待登录完成后手动调用refetch方法触发查询:

<script>
import gql from 'graphql-tag';
import { useMutation, useQuery } from '@vue/apollo-composable';
import { ref, computed } from 'vue';
import { useUserStore } from '../stores/user';
import { myUser } from '@/apollo/queries';
import { loginUser } from '@/apollo/mutations';

export default {
  name: 'LoginForm',

  setup() {
    let username = ref('');
    let password = ref('');
    let loggedIn = ref(false);

    const error = computed(() => {
      return username.value === '' ? 'The username is required' : '';
    });

    // 初始化myUser查询,禁用自动执行
    const { refetch: fetchMyUser } = useQuery(myUser, null, { enabled: false });

    const {
      mutate: loginUserMutation,
      onDone,
      onError,
    } = useMutation(loginUser);

    onDone((res) => {
      if (res?.data?.loginUser && res.data.loginUser.success) {
        localStorage.setItem('access-token', res.data.loginUser.msg);

        useUserStore().$patch({
          username: res.data.loginUser.msg,
        });

        loggedIn.value = true;
        // 登录完成后手动触发myUser查询
        fetchMyUser();
      }
    });

    const loginBtnClicked = () => {
      loginUserMutation({
        username: username.value,
        password: password.value,
        platform: 'PC',
      });
    };

    return {
      username,
      password,
      error,
      loginBtnClicked,
      loginUserMutation,
    };
  },
};
</script>

方式2:通过enabled属性自动触发

将useQuery的enabled参数绑定到loggedIn ref,当登录成功后loggedIn变为true时,自动执行查询:

<script>
import gql from 'graphql-tag';
import { useMutation, useQuery } from '@vue/apollo-composable';
import { ref, computed } from 'vue';
import { useUserStore } from '../stores/user';
import { myUser } from '@/apollo/queries';
import { loginUser } from '@/apollo/mutations';

export default {
  name: 'LoginForm',

  setup() {
    let username = ref('');
    let password = ref('');
    let loggedIn = ref(false);

    const error = computed(() => {
      return username.value === '' ? 'The username is required' : '';
    });

    // 绑定enabled到loggedIn,自动触发查询
    const { result: userResult } = useQuery(myUser, null, { enabled: loggedIn });

    const {
      mutate: loginUserMutation,
      onDone,
      onError,
    } = useMutation(loginUser);

    onDone((res) => {
      if (res?.data?.loginUser && res.data.loginUser.success) {
        localStorage.setItem('access-token', res.data.loginUser.msg);

        useUserStore().$patch({
          username: res.data.loginUser.msg,
        });

        // 状态变更后自动触发myUser查询
        loggedIn.value = true;
      }
    });

    const loginBtnClicked = () => {
      loginUserMutation({
        username: username.value,
        password: password.value,
        platform: 'PC',
      });
    };

    return {
      username,
      password,
      error,
      loginBtnClicked,
      loginUserMutation,
      userResult // 可在模板中直接使用查询结果
    };
  },
};
</script>

关键说明

  • 两种方式都依赖@vue/apollo-composable的生命周期管理,确保JWT已存入localStorage后再执行查询,Apollo Client会自动携带令牌请求接口。
  • 方式1适合需要自定义触发时机或额外前置处理的场景;方式2更简洁,利用Vue响应式状态自动控制查询执行逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:50:48