vue3中如何让响应式的依赖注入与axios结合?

作者站长头像
站长
· 阅读数 16

问题描述

我在使用axios进行对后端api访问的时候,有时候会传类似userId,articleId这类的值。像这样:.../user/updateuser/7f747396-2845-4e09-863c-9ee0318849aa

但这样我可能会在一个组件中进行两次axios请求。

我在使用axios时,建了一个文件用来写axios的拦截器,让每次请求的请求头都带有token。

我想到vue的依赖注入,我认为可以在app.vue中请求一次,然后其他组件就都能拿到通过访问验证token接口后拿到的数据

大概就是这样:

相关代码

axios拦截器

//...
const interceptor = axiosInstance.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    config.headers!["Authorization"] =
      "Bearer " + localStorage.getItem("token");
    // 解除request body的上限
    // config.maxContentLength = Infinity;
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

//...

app.vue

<script setup lang="ts">
//...

const { proxy } = getCurrentInstance() as any;
// 用户数据
const data = ref({});

onMounted(() => {
  proxy
    .axios({
      method: "get",
      url: "api/users",
    })
    .then((res: any) => {
      // console.log(res);
      data.value = res.data;
    });
});
provide("userData", data);
</script>

子组件

<script setup lang="ts">
//...

// 注入userdata
const data: any = inject("userData")!;

</script>

<template>
    <!-- ... -->
    <header>
      <span class="text-2xl">{{ data.username }}</span>
    </header>
</template>

app.vue中的onMounted()只会在最开始执行。我想让app.vue中的js代码在更新了登录状态后执行 (我将token存入的localStorage),该如何做呢?

回复
1个回答
avatar
test
2024-07-20

可以用pinia存起来,需要用的时候就引入storehttps://pinia.vuejs.org/intro...

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容