5.微信小程序

1.模块封装

(1)可以减少代码冗余

(2)进行后续网络封装

2.消息提示模块封装

(1)封装思路

创建一个toast方法对wx.showToast()方法进行封装

(2)调用方法

导入使用:import{toast}from'./extendApi'

toast()

toast({title:'数据加载失败..',mask:true})

挂载到wx全局对象上

wx.toast()

wx.toast({title:'数据加载失败..',mask:true})

3.对话框模块封装

wx.showModal()模态对话框是一个频繁使用的Api,通常向用户询问一些操作,如是否退出删除

4.封装本地存储Api

(1)数据存储

(2)从本地读取数据

(3)从本地移除指定k的数据

(4)清除本地所有数据

5.封装异步Api

(1)数据存储

(2)从本地读取数据

(3)从本地移除指定k的数据

(4)清除本地所有数据

6.网络请求封装

小程序大部分Api都是异步Api,这类Api接口通常都接收一个Object类型的形参

实例化代码并暴露出去

html 复制代码
const instance = new WxREquest()
export default instance

调用

html 复制代码
import instance from'../../ utils/request'
Page({
    handler(){
        //第一种方法
        instance.request({
            url:'',
            method:''.
        })
        .then((res)=>{
            console.log(res);
        })
        //第二种
        const res = await instance.request({
            url:'',
            method:'',
        })
            console.log(res);
    }
})

设置请求参数

html 复制代码
class WxRequest{

    default = {
        baseURL:''
        url:''
        data:null,
        method:'GET',
        header:{
            "Content-type":'application/json'
        },
        timeout:60000
    }

    constructor(params = {}){

    this.default = Object.assign({},this.defaults,params)

    }

    request(options){
        options.url = this.default.baseURL + options.url
        options = {...this,defaults,...options}
        return new Promise((resolve,reject)=>{
            wx.request({
                ..option,
                
                success:(res) => {
                    resolve(res)
                },

                fail:(err) => {
                    reject(err)
                },
            })
        })
    }
}
实例化
const instance = new WxRequest({
    timeout:15000
})

export default instance

封装快捷方法

html 复制代码
get(url,data = {},config = {}){
    return this.request(Object.assign({url,method:'GET'},config))
}
delete(url,data = {},config={}){
    return this.request(Object.assign({url.data,methd:'DELETE'},config))
}

定义请求拦截器

html 复制代码
interceptors = {
    request:(config) => config,
    request:(respnse) => response,
}

配置请求拦截器

html 复制代码
instance,interceptor是.request= (config) => {
    return config
}

instance.interceptors.response = (response) => {
    return response
}
java 复制代码
 
class WxRequest {
    

   request(options) {

    return new Promise((resolve, reject) => {
      wx.request({
        ...options,
 
      success: (res) => {

        if (this.interceptors.response) {

            res = this.interceptors.response({ response: res, isSuccess: true })
        }
 

        resolve(res)
      },
 

      fail: (err) => {

        if (this.interceptors.response) {

            err = this.interceptors.response({ response: err, isSuccess: true })
          }
 

          reject(err)
        }
          
      })
    })
  }

}
 
 

 
 

const instance = new WxRequest({
  baseURL: 'https://gmall-prod.atguigu.cn/mall-api'
})
 

instance.setRequestInterceptor((config) => {
  console.log('执行请求拦截器')
 
  return config
})
 

 instance.setResponseInterceptor((response) => {
  const { response: res, isSuccess } = response
 

  if (!isSuccess) {
    wx.toast('网络异常,请稍后重试~')

    return res
  }
 

 return response.data
})
 

export default instance
java 复制代码
import WxRequest from './request'
 
import { clearStorage } from './storage'
import { modal, toast } from './extendApi'

const instance = new WxRequest({
  baseURL: 'https://gmall-prod.atguigu.cn/mall-api',
  timeout: 15000
})
 
instance.interceptors.request = (config) => {
  if (getStorage('token')) {
    config.header['token'] = wx.getStorageSync('token')
  }
 
  return config
}
 
instance.interceptors.response = async (response) => {
  const { isSuccess, data } = response

  if (!isSuccess) {
    wx.showToast({
      title: '网络异常请重试',
      icon: 'error'
    })
 
    return response
  }
 
  switch (data.code) {
    case 200:
      return data
 
    case 208:
      const res = await modal({
        title: '提示',
        content: '鉴权失败,请重新登录',
        showCancel: false
      })
 
      if (res) {
        clearStorage()
        wx.navigateTo({
          url: '/pages/login/login'
        })
      }
 
      return Promise.reject(response)
 
    default:
      toast({
        title: '程序异常,请联系客服或稍后重试!'
      })
 
      return Promise.reject(response)
  }
 

}
 
export default instance

添加loading

java 复制代码
class WxRequest {
 
 
  constructor(options = {}) {
  }
 
  request(options) {
    options.url = this.defaults.baseURL + options.url
    options = { ...this.defaults, ...options }
      
     wx.showLoading()
 
    if (this.interceptors.request) {
      options = this.interceptors.request(options)
    }
      
    return new Promise((resolve, reject) => {
      wx.request({
        ...options,
        success: (res) => {
        },
        fail: (err) => {
        },
         complete: () => {
           wx.hideLoading()
         }
      })
    })
  }
 
}

控制loading显示

java 复制代码
class WxRequest {
  defaults = {
    url: '', // 开发者服务器接口地址
    data: null, // 请求参数
    header: {}, // 设置请求的 header
    timeout: 60000, // 超时时间
    method: 'GET', // 请求方式
    isLoading: true // 是否显示 loading 提示框
  }

}

实例化

java 复制代码
const instance = new WxRequest({
  baseURL: 'https://gmall-prod.atguigu.cn/mall-api',
   isLoading: false // 是否隐藏 loading
})

7.封装upload Api

java 复制代码
Page({

  data: {
    avatarUrl: '../../assets/Jerry.png'
  },
 
  async chooseavatar(event) {

    const { avatarUrl } = event.detail
 
    const res = await instance.upload(
      '/fileUpload',
      event.detail.avatarUrl,
      'file'
    )
 
    this.setData({
      avatarUrl: res.data
    })
  },
    
}

8.使用npm包发送请求

java 复制代码
import WxRequest from './request'
import { getStorage, clearStorage } from './storage'
import { modal, toast } from './extendApi'
import { env } from './env'
 
const instance = new WxRequest({
  baseURL: env.baseURL,
  timeout: 15000,
  isLoading: false
})
 
instance.interceptors.request = (config) => {
 
  const token = getStorage('token')
 
  if (token) {
    config.header['token'] = token
  }
 
  return config
}
 
instance.interceptors.response = async (response) => {
  const { isSuccess, data } = response
 

  if (!isSuccess) {
    wx.showToast({
      title: '网络异常请重试',
      icon: 'error'
    })
 
    return response
  }
 
  switch (data.code) {
    case 200:
      return data
 
    case 208:
      const res = await modal({
        content: '鉴权失败,请重新登录',
        showCancel: false // 不显示取消按钮
      })
 
      if (res) {
        clearStorage()
 
        wx.navigateTo({
          url: '/pages/login/login'
        })
      }
 
      return Promise.reject(response)
 
    default:
      toast({
        title: '程序出现异常,请联系客服或稍后重试'
      })
 
      return Promise.reject(response)
  }
}

export default instance
相关推荐
高级程序源2 分钟前
django房屋租赁系统28636-计算机课程设计、毕业设计
python·mysql·elasticsearch·小程序·django·flask·课程设计
CRMEB定制开发2 分钟前
开源模型正在吃掉闭源的市场,这意味着什么?
小程序·公众号商城·商城源码·crmeb·开源商城
andrsted4 小时前
练题簿在线免费刷题:选择、填空、简答与排序,多种题型练出不同的掌握程度
学习·微信小程序·小程序·学习方法·刷题
长沙三为智能科技12 小时前
家政小程序门店运营模块设计:会员、下单、派单、结算四段链路的落地拆解
python·小程序·内容运营
weixin_1772972206914 小时前
回收小程序做自营还是撮合?先看你手里有什么
小程序
andrsted14 小时前
练题簿在线免费刷题:Word、PDF 导题与预览补全,把现成资料变成可练习题库
微信小程序·小程序·pdf·word·学习方法·刷题
AI行业应用研究14 小时前
会务信息载体的演进:纸质、PDF 与结构化数据源的分发成本与版本一致性
大数据·人工智能·安全·小程序·架构·pdf
Geek_Vison15 小时前
保险APP已经用了Flutter,还能接入小程序吗?
flutter·小程序·uni-app·mpaas·小程序容器
FX1317887KP_1 天前
从KET到PET口语进阶:词汇量翻倍后,口语如何跟上?
小程序·ket口语·pet口语·fce备考·剑桥英语
m0_587383001 天前
工业场景设备维修维护实战技巧 全流程标准化落地与常见问题排查指南
java·spring·小程序·架构·需求分析