vue3中封装Axios请求及在组件中使用的方法是什么

发布时间:2023-04-25 14:59:49 作者:iii
来源:亿速云 阅读:193

Vue3中封装Axios请求及在组件中使用的方法是什么

在现代的前端开发中,网络请求是不可或缺的一部分。Vue3作为一款流行的前端框架,提供了强大的响应式系统和组件化开发能力。而Axios则是一个基于Promise的HTTP客户端,广泛应用于浏览器和Node.js环境中。本文将详细介绍如何在Vue3中封装Axios请求,并在组件中使用这些封装好的请求方法。

1. 为什么需要封装Axios请求

在开发过程中,直接使用Axios进行网络请求虽然简单,但随着项目规模的扩大,直接使用Axios会导致代码重复、难以维护等问题。因此,封装Axios请求具有以下几个优点:

  1. 代码复用:将通用的请求逻辑封装起来,避免重复代码。
  2. 统一管理:集中管理请求的配置、拦截器、错误处理等。
  3. 易于维护:当需要修改请求逻辑时,只需修改封装的部分,而不需要修改每个使用请求的地方。
  4. 提高开发效率:封装后的请求方法更加简洁,减少了开发者的工作量。

2. 创建Axios实例

首先,我们需要创建一个Axios实例,并对其进行一些基本的配置。这些配置包括基础URL、超时时间、请求头等。

// src/utils/request.js
import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://api.example.com', // 基础URL
  timeout: 10000, // 超时时间
  headers: {
    'Content-Type': 'application/json', // 请求头
  },
});

export default instance;

在这个例子中,我们创建了一个Axios实例,并设置了基础URL和超时时间。baseURL是请求的基础路径,timeout是请求超时时间,headers是请求头。

3. 添加请求拦截器

请求拦截器可以在请求发送之前对请求进行处理,例如添加认证信息、修改请求头等。

// src/utils/request.js
instance.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

在这个例子中,我们在请求发送之前检查本地存储中是否存在token,如果存在则将其添加到请求头中。

4. 添加响应拦截器

响应拦截器可以在接收到响应之后对响应进行处理,例如统一处理错误、格式化数据等。

// src/utils/request.js
instance.interceptors.response.use(
  (response) => {
    // 对响应数据做些什么
    return response.data;
  },
  (error) => {
    // 对响应错误做些什么
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 处理未授权错误
          break;
        case 404:
          // 处理未找到错误
          break;
        default:
          // 处理其他错误
          break;
      }
    }
    return Promise.reject(error);
  }
);

在这个例子中,我们对响应数据进行了处理,只返回response.data。同时,我们还处理了常见的HTTP错误状态码。

5. 封装常用的请求方法

接下来,我们可以封装一些常用的请求方法,例如getpostputdelete等。

// src/utils/request.js
export const get = (url, params) => {
  return instance.get(url, { params });
};

export const post = (url, data) => {
  return instance.post(url, data);
};

export const put = (url, data) => {
  return instance.put(url, data);
};

export const del = (url) => {
  return instance.delete(url);
};

在这个例子中,我们封装了getpostputdelete四个常用的请求方法。这些方法都返回一个Promise对象,可以在组件中直接使用。

6. 在组件中使用封装好的请求方法

现在,我们已经封装好了Axios请求方法,接下来我们可以在Vue3组件中使用这些方法。

6.1 使用get请求

<template>
  <div>
    <h1>用户列表</h1>
    <ul>
      <li v-for="user in users" :key="user.id">{{ user.name }}</li>
    </ul>
  </div>
</template>

<script>
import { get } from '@/utils/request';
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const users = ref([]);

    onMounted(async () => {
      try {
        const response = await get('/users');
        users.value = response;
      } catch (error) {
        console.error('获取用户列表失败', error);
      }
    });

    return {
      users,
    };
  },
};
</script>

在这个例子中,我们在组件的setup函数中使用get方法获取用户列表,并将结果赋值给users变量。然后,我们在模板中使用v-for指令渲染用户列表。

6.2 使用post请求

<template>
  <div>
    <h1>添加用户</h1>
    <form @submit.prevent="addUser">
      <input v-model="name" placeholder="用户名" />
      <button type="submit">添加</button>
    </form>
  </div>
</template>

<script>
import { post } from '@/utils/request';
import { ref } from 'vue';

export default {
  setup() {
    const name = ref('');

    const addUser = async () => {
      try {
        await post('/users', { name: name.value });
        alert('用户添加成功');
        name.value = '';
      } catch (error) {
        console.error('添加用户失败', error);
      }
    };

    return {
      name,
      addUser,
    };
  },
};
</script>

在这个例子中,我们在组件的setup函数中使用post方法添加用户。当用户提交表单时,addUser函数会被调用,发送post请求并将用户名传递给服务器

6.3 使用put请求

<template>
  <div>
    <h1>编辑用户</h1>
    <form @submit.prevent="updateUser">
      <input v-model="name" placeholder="用户名" />
      <button type="submit">更新</button>
    </form>
  </div>
</template>

<script>
import { put } from '@/utils/request';
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const name = ref('');
    const userId = ref(null);

    onMounted(async () => {
      try {
        const response = await get(`/users/${userId.value}`);
        name.value = response.name;
      } catch (error) {
        console.error('获取用户信息失败', error);
      }
    });

    const updateUser = async () => {
      try {
        await put(`/users/${userId.value}`, { name: name.value });
        alert('用户更新成功');
      } catch (error) {
        console.error('更新用户失败', error);
      }
    };

    return {
      name,
      updateUser,
    };
  },
};
</script>

在这个例子中,我们在组件的setup函数中使用put方法更新用户信息。首先,我们在组件挂载时获取用户信息并填充到表单中。然后,当用户提交表单时,updateUser函数会被调用,发送put请求并将更新后的用户名传递给服务器。

6.4 使用delete请求

<template>
  <div>
    <h1>删除用户</h1>
    <button @click="deleteUser">删除用户</button>
  </div>
</template>

<script>
import { del } from '@/utils/request';
import { ref } from 'vue';

export default {
  setup() {
    const userId = ref(null);

    const deleteUser = async () => {
      try {
        await del(`/users/${userId.value}`);
        alert('用户删除成功');
      } catch (error) {
        console.error('删除用户失败', error);
      }
    };

    return {
      deleteUser,
    };
  },
};
</script>

在这个例子中,我们在组件的setup函数中使用delete方法删除用户。当用户点击删除按钮时,deleteUser函数会被调用,发送delete请求并删除指定用户。

7. 处理请求错误

在实际开发中,网络请求可能会因为各种原因失败。因此,我们需要在组件中处理这些错误,并给用户提供友好的提示。

<template>
  <div>
    <h1>用户列表</h1>
    <ul>
      <li v-for="user in users" :key="user.id">{{ user.name }}</li>
    </ul>
    <p v-if="error">{{ error }}</p>
  </div>
</template>

<script>
import { get } from '@/utils/request';
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const users = ref([]);
    const error = ref('');

    onMounted(async () => {
      try {
        const response = await get('/users');
        users.value = response;
      } catch (err) {
        error.value = '获取用户列表失败,请稍后重试';
        console.error('获取用户列表失败', err);
      }
    });

    return {
      users,
      error,
    };
  },
};
</script>

在这个例子中,我们在组件中定义了一个error变量,用于存储错误信息。当请求失败时,我们将错误信息赋值给error变量,并在模板中显示出来。

8. 使用Vuex管理请求状态

在大型应用中,网络请求的状态管理可能会变得复杂。为了简化状态管理,我们可以使用Vuex来管理请求状态。

8.1 创建Vuex模块

首先,我们创建一个Vuex模块来管理用户相关的状态。

// src/store/modules/user.js
import { get, post, put, del } from '@/utils/request';

const state = {
  users: [],
  error: '',
};

const mutations = {
  SET_USERS(state, users) {
    state.users = users;
  },
  SET_ERROR(state, error) {
    state.error = error;
  },
};

const actions = {
  async fetchUsers({ commit }) {
    try {
      const response = await get('/users');
      commit('SET_USERS', response);
    } catch (error) {
      commit('SET_ERROR', '获取用户列表失败,请稍后重试');
      console.error('获取用户列表失败', error);
    }
  },
  async addUser({ commit }, name) {
    try {
      await post('/users', { name });
      commit('SET_ERROR', '');
    } catch (error) {
      commit('SET_ERROR', '添加用户失败,请稍后重试');
      console.error('添加用户失败', error);
    }
  },
  async updateUser({ commit }, { id, name }) {
    try {
      await put(`/users/${id}`, { name });
      commit('SET_ERROR', '');
    } catch (error) {
      commit('SET_ERROR', '更新用户失败,请稍后重试');
      console.error('更新用户失败', error);
    }
  },
  async deleteUser({ commit }, id) {
    try {
      await del(`/users/${id}`);
      commit('SET_ERROR', '');
    } catch (error) {
      commit('SET_ERROR', '删除用户失败,请稍后重试');
      console.error('删除用户失败', error);
    }
  },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};

在这个例子中,我们创建了一个user模块,用于管理用户相关的状态。state中定义了userserror两个状态,mutations用于修改状态,actions用于执行异步操作。

8.2 在组件中使用Vuex

接下来,我们可以在组件中使用Vuex来管理请求状态。

<template>
  <div>
    <h1>用户列表</h1>
    <ul>
      <li v-for="user in users" :key="user.id">{{ user.name }}</li>
    </ul>
    <p v-if="error">{{ error }}</p>
  </div>
</template>

<script>
import { mapState, mapActions } from 'vuex';

export default {
  computed: {
    ...mapState('user', ['users', 'error']),
  },
  created() {
    this.fetchUsers();
  },
  methods: {
    ...mapActions('user', ['fetchUsers']),
  },
};
</script>

在这个例子中,我们使用mapStatemapActions将Vuex中的状态和操作映射到组件中。在组件创建时,我们调用fetchUsers操作来获取用户列表。

9. 总结

在Vue3中封装Axios请求并

推荐阅读:
  1. Vue3父子组件间通信、组件间双向绑定的方法
  2. 如何在vue3中使用setup、 ref、reactive

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue3 axios

上一篇:怎么使用vue+springboot上传大文件

下一篇:Vue3中的插件如何使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》