微信小程序mpvue中封装axios(js或ts适用)

微信小程序mpvue中封装axios(js或ts适用)

mpvue完整模板项目可见github链接:mpvue2-typescript-axios

1.安装axios

$ npm install --save axios 

2.封装axios:

此为大致示例,可根据具体情况增加配置
敲黑板!划重点!
由于微信小程序需要用微信官方请求接口 wx.request,因此需要用adapter自定义
还有一些上传下载等操作微信也需要调用微信官方相关接口

//axios.js文件
//注意这里需这么导入,否则可能报错
import axios from '../../node_modules/axios/dist/axios'
// 时间戳
//const NewTimeStamp = new Date().getTime()

// axios全局设置
const Axios = axios.create({
 baseURL: process.env.BASE_API,
 timeout: 1000 * 60 * 10,
 responseType: 'json'
})

// axios.defaults.timeout = 30000
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

//划重点! 由于微信小程序需要用微信官方请求接口,因此需要用adapter自定义
Axios.defaults.adapter = function (config) {
// let baseURL = process.env.BASE_API
// 发交易之前显示加载中
wx.showLoading({
 title: '拼命加载中...'
})
return new Promise((resolve, reject) => {
 wx.request({
   url: config.url,
   method: config.method,
   data: config.params,
   success: (res) => {
     return resolve(res)
   },
   fail: (err) => {
     return reject(err)
   },
   complete: res => {
     wx.hideLoading()
     // TODO:
     }
   })
 })
}

// axios请求拦截
Axios.interceptors.request.use(
 config => {
 // 若是有做鉴权token , 就给头部带上token
 // let token = window.sessionStorage.getItem(__TOKEN_KEY__)
 // if (token) {
 //   config.headers.Authorization = `Bearer ${token}`
 // }
   return config
 },
 error => {
   sendError(error)
   return Promise.reject(error.data)
 }
)

// axios 响应拦截,对响应的状态处理
Axios.interceptors.response.use(
//   function (response) {
//     console.log(response.data.data) // 响应成功
//     return response
//   },
//   function (error) {
//     // console.log(error); //响应失败
//     return Promise.reject(error)
//   })
 res => {
 // 200,204为处理成功
 //注意这里statusCode有可能微信的ts声明文件里未定义,需要去声明文件里定义一下
   if ([200, 204].indexOf(res.statusCode) === -1) {
     console.log('res.status', res)
     sendError(res)
     return Promise.reject(res.data)
   }
   return res
 },
 error => {
   sendError(error)
   return Promise.reject(error)
 })
 
//封装fetch并暴露
export function fetch (options) {
 return new Promise((resolve, reject) => {
   Axios(options)
     .then(response => {
       resolve(response)
     })
     .catch(error => {
       reject(error)
     })
 })
}
/**
* 此处为捕获到的异常,可以将此异常提交给Vuex的Store或者使用微信组件弹出
*
* @param {any} error
*/
function sendError (error) {
 let type = new Date().getMilliseconds()
 let data = []
 var msg = '发生错误'
 console.log(msg)
 if (error.data) {
   data = error.data.errors
   msg = error.data.message
 } else if (error.response) {
   data = error.response.data
   msg = data.message
 } else {
   msg = error.message
 }
 let errorData = {
   type,
   data,
   message: msg
 }
 console.log(errorData)
 // 1。store.dispatch('error/appendError', errorData)
 // 2。弹出
 wx.showToast({
   title: errorData.message,
   icon: 'none',
   duration: 3000,
   complete: (res) => {
   }
 })
}

3.api接口里调用示例:

此为Typescript示例

//exampleAPI.ts
//导入axios.js文件
import { fetch } from "../utils/axios";
//暴露此类
export class ExampleAPI{
 // baseApi = process.env.BASE_API;
//  baseService = process.env.BASE_SERVICE;
  //get请求
  getAPI(data) {
   return fetch({
     url: 'XXX/XXXXX',
     method: "get",
     params: data
    });
  }
  //post请求
  postAPI(data) {
   return fetch({
     url: 'XXX/XXXXX',
     method: "post",
     params: data
    });
  }
}
### Windsurf框架用于微信小程序开发 Windsurf是一个基于TypeScript的全栈开发框架,能够简化前后端一体化的应用构建过程。对于微信小程序而言,开发者可以利用Windsurf来加速项目搭建以及提升代码质量[^1]。 #### 初始化Windsurf项目 为了启动一个新的微信小程序工程,在命令行工具中执行如下操作: ```bash npm install -g @windsurf/cli windsurf init my-weapp-project --template weapp cd my-weapp-project npm run dev:weapp ``` 上述指令会安装全局CLI并创建一个名为`my-weapp-project`的新目录作为项目的根路径;通过指定模板参数`--template weapp`告知系统要初始化的是针对微信环境的小程序应用[^2]。 #### 配置文件说明 在生成的基础结构里包含了几个重要的配置项位于`src/app.config.ts`内: - `pages`: 定义页面路由映射关系; - `window`: 设置窗口外观属性比如背景颜色等; - `networkTimeout`: 调整网络请求超时时间设置。 这些选项可以根据实际需求调整优化用户体验[^3]。 #### 组件化编程实践 借助于Vue-like语法糖的支持,编写自定义组件变得异常简单直观。下面给出一段展示按钮点击计数功能的例子: ```typescript // src/components/CounterButton/index.tsx import Taro, { useState } from '@tarojs/taro'; import './index.scss'; export default function CounterButton() { const [count, setCount] = useState<number>(0); return ( <button onClick={() => setCount(count + 1)}> Clicked {count} times </button> ); } ``` 此片段展示了如何引入状态管理机制,并将其绑定到UI事件处理逻辑上实现交互效果[^4]。 #### 数据获取与API调用 当涉及到远程数据源访问时,推荐采用Axios库来进行HTTP通信工作。这里提供了一个简单的GET请求样例供参考: ```javascript // src/utils/request.js import axios from 'axios'; const instance = axios.create({ baseURL: 'https://api.example.com', }); export async function fetchUserData(userId) { try { const response = await instance.get(`/users/${userId}`); console.log(response.data); return response.data; } catch (error) { console.error('Error fetching user data:', error.message); } } ``` 这段脚本封装了对特定URL模式下的资源读取流程,便于维护的同时也提高了可重用度[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值