axios 预配置

大家都知道,axios预配置不外乎三件事

  • 第一处理post请求,以及参数为数组的处理
  • 第二增加loading配置
  • 第三异常情况处理,公共参数处理

下边我一一细说下

post处理,业界 公认三种方式

  • 使用axios自带的 transformRequest,在请求发送前将请求数据进行转换
 // global set axios
  axios.defaults.headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
  };
  // eslint-disable-next-line
  axios.defaults.transformRequest = [function (data) {
    // 对post传参进行处理,Object,Array 会被 JSON.stringify 处理
    let newData = '';
    // eslint-disable-next-line
    for (let k in data) {
      newData += `&${encodeURIComponent(k)}=${encodeURIComponent((typeOf(data[k]) === 'object') ? JSON.stringify(data[k]) : data[k])}`;
    }
    if (newData.indexOf('&') === 0) {
      newData = newData.substring(1);
    }
    return newData;
  }];

这个需要手动处理对象数组,否则后端不识别

  • 如果使用模块化开发,可以使用qs模块进行转换
if (config.method === 'post') {
	config.data = qs.stringify(config.data)
 }
  • new URLSearchParams()
var params = new URLSearchParams();
params.append('a', 'value1');
params.append('b', 'value2');
axios.post('/url', params);

loading配置

axios.interceptors.request.use(config => {
    if (!config.noloading) {//考虑到有些情况不需要loading,自定义loading配置
      Indicator.open()
    }
 }
axios.interceptors.response.use(response => {
    Indicator.close()
}
  • 异常处理
axios.interceptors.response.use(response => {
    Indicator.close()
    if (response.data.errno === 0 || response.data.errno === 140002) {
      return response
    } else {
      Toast(response.data.errmsg)
    }
  }, error => {
    Toast('系统错误')
    return Promise.resolve(error.response)
  })
  • 公共处理
	let commonParams = {}
    let datas = config.data || {}
    Object.assign(datas, commonParams)
    config.data = datas
  • 完整代码
import qs from 'qs'
import {Toast, Indicator} from 'mint-ui'
const plugin = {}

plugin.install = (Vue, axios) => {
  if (plugin.installed || !axios) {
    return
  }
  plugin.installed = true
  // bind axios to Vue
  Vue.axios = axios
  Object.defineProperties(Vue.prototype, {
    axios: {
      get () {
        return axios
      }
    },
    $http: {
      get () {
        return axios
      }
    }
  })

  axios.interceptors.request.use(config => {
    if (!config.noloading) {
      Indicator.open()
    }
    let commonParams = {}
    let datas = config.data || {}
    Object.assign(datas, commonParams)
    config.data = datas
    if (config.method === 'post') {
      config.data = qs.stringify(config.data)
    }
    return config
  }, error => {
    return Promise.reject(error)
  })

  axios.interceptors.response.use(response => {
    Indicator.close()
    if (response.data.errno === 0) {
      return response
    } else {
      Toast(response.data.errmsg)
    }
  }, error => {
    Toast('系统错误')
    return Promise.resolve(error.response)
  })
}
export default plugin

参考地址:https://github.com/axios/axios#using-applicationx-www-form-urlencoded-format

<think>嗯,用户想了解在Vue3项目中如何集成和置Element Plus与Axios。首先,我需要回忆一下Vue3的基本项目结构,以及Element Plus和Axios的安装置步骤。记得Element Plus是一个基于Vue3的UI组件库,而Axios则是一个常用的HTTP客户端,用于发送请求。 首先,应该从创建Vue3项目开始,可能使用Vue CLI或者Vite。根据用户提供的引用[2],Vue CLI是官方推荐的工具,可以快速生成项目。然后,安装Element Plus,可能需要使用npm或yarn来添加依赖。安装完成后,需要在main.js或main.ts中进行全局置,可能包括引入组件库的样式和插件。 接下来是Axios的集成。用户需要安装Axios,然后在项目中创建实例,置基础URL和拦截器。通常会在src目录下创建一个api文件夹,存放请求相关的置。同时,可能需要将Axios实例挂载到Vue的原型上,方便组件内调用,不过现在更推荐使用provide/inject或者直接导入实例。 然后,用户可能需要置ESLint和Prettier,如引用[3]提到的,确保代码风格统一。这部分可能需要安装相关插件,并在置文件中进行设置。此外,husky的置可以用于Git钩子,确保提交前通过代码检查。 还需要考虑Element Plus的按需导入,以减小项目体积。这可能需要安装unplugin-vue-components等插件,并在vite或webpack置中设置自动导入。这样在使用组件时就不需要手动注册了,提高开发效率。 另外,用户可能会遇到样式不生效的问题,需要检查是否正确引入了Element Plus的样式文件。对于Axios,拦截器的置和处理错误响应也是关键点,需要示例说明如何添加请求拦截器和响应拦截器。 最后,结合引用[4]中的示例,可能需要展示如何在Vue组件中使用Element Plus的组件和Axios发送请求,比如在Chat.vue中调用接口获取数据并处理结果。同时,提醒用户注意跨域问题,需要在后端或devServer中置代理。 总结步骤应该是:创建项目→安装置Element Plus→安装Axios→代码规范和Git钩子设置→示例演示。需要确保每一步都有明确的代码示例和置说明,并参考用户提供的引用内容,特别是引用[3]中的项目置部分。</think>### Vue3集成Element Plus与Axios的步骤 #### 一、项目初始化与依赖安装 1. 使用Vue CLI创建项目(需已全局安装@vue/cli): ```bash vue create vue3-element-demo ``` 选择Vue3设模板[^2]。 2. 安装Element Plus: ```bash npm install element-plus @element-plus/icons-vue ``` 3. 安装Axios: ```bash npm install axios ``` #### 二、Element Plus全局置 1. 在`src/main.js`中引入: ```javascript import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import App from './App.vue' const app = createApp(App) app.use(ElementPlus) app.mount('#app') ``` 2. (可选) 按需导入置: 安装插件: ```bash npm install -D unplugin-vue-components unplugin-auto-import ``` 在`vite.config.js`中添加: ```javascript import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' export default defineConfig({ plugins: [ AutoImport({ resolvers: [ElementPlusResolver()], }), Components({ resolvers: [ElementPlusResolver()], }), ] }) ``` #### 三、Axios封装置 1. 创建`src/api/request.js`: ```javascript import axios from 'axios' const service = axios.create({ baseURL: 'https://api.example.com', timeout: 10000 }) // 请求拦截器 service.interceptors.request.use(config => { config.headers['Authorization'] = localStorage.getItem('token') return config }) // 响应拦截器 service.interceptors.response.use( response => response.data, error => { console.error('请求错误:', error) return Promise.reject(error) } ) export default service ``` #### 四、代码规范置(参考引用[3]) 1. 在`.eslintrc.js`中置: ```javascript module.exports = { rules: { 'vue/multi-word-component-names': 'off' } } ``` 2. 置husky提交检查: ```bash npx husky add .husky/pre-commit "npm run lint" ``` #### 五、组件中使用示例 ```vue <template> <el-button @click="fetchData">获取数据</el-button> <el-table :data="tableData"> <el-table-column prop="title" label="题" /> </el-table> </template> <script setup> import { ref } from 'vue' import axios from '@/api/request' const tableData = ref([]) const fetchData = async () => { try { const res = await axios.get('/news') tableData.value = res.data } catch (error) { ElMessage.error('数据加载失败') } } </script> ``` [^1]: 注意Element Plus组件需按规范命名 [^2]: 使用Vue CLI可快速搭建基础工程结构 [^3]: 推荐置ESLint+Prettier保证代码质量 [^4]: 组件文件建议按功能模块组织在views目录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值