微信小程序-封装通用模块

文章目录

微信小程序-封装通用模块

封装toast和modal

js 复制代码
/** 提示消息框 */
function toast({
  title = "数据加载中",
  icon = "none",
  duration = 2000,
  mask = true,
}) {
  wx.showToast({
    title,
    icon,
    duration,
    mask,
  })
}

/** 模拟对话框 */
function modal(opts = {}) {
  const defaultOpts = {
    title: "提示",
    content: "您确定执行该操作吗?",
    confirmColor: "#f3514f",
  }
  return new Promise((resolve) => {
    const options = Object.assign({}, defaultOpts, opts)
    wx.showModal({
      ...options,
      complete({ confirm, cancel }) {
        confirm && resolve(true)
        cancel && resolve(false)
      },
    })
  })
}

// 挂载到 wx 全局对象上
wx.toast = toast
wx.modal = modal

export { toast, modal }

封装storage

js 复制代码
/** 同步存储数据 */
export const setStorage = (key, data) => {
  try {
    wx.setStorageSync(key, data)
  } catch (e) {
    console.error(`存储指定 ${key} 数据时发生了异常`, e)
  }
}

/** 同步获取数据 */
export const getStorage = (key) => {
  try {
    const value = wx.getStorageSync(key)
    if (value) {
      return value
    }
  } catch (e) {
    console.error(`获取指定 ${key} 数据时发生了异常`, e)
  }
}

/** 同步删除指定数据 */
export const removeStorage = (key) => {
  try {
    wx.removeStorageSync(key)
  } catch (e) {
    console.error(`移除指定 ${key} 数据时发生了异常`, e)
  }
}

/** 同步清空全部数据 */
export const clearStorage = () => {
  try {
    wx.clearStorageSync()
  } catch (e) {
    console.error(`清空数据发生了异常`, e)
  }
}

/** 异步存储数据 */
export const asyncSetStorage = (key, data) => {
  return new Promise((resolve) => {
    wx.setStorage({
      key,
      data,
      complete(res) {
        resolve(res)
      },
    })
  })
}

/** 异步获取指定数据 */
export const asyncGetStorage = (key) => {
  return new Promise((resolve) => {
    wx.getStorage({
      key,
      complete(res) {
        resolve(res)
      },
    })
  })
}

/** 异步删除指定数据 */
export const asyncRemoveStorage = (key) => {
  return new Promise((resolve) => {
    wx.removeStorage({
      key,
      complete(res) {
        resolve(res)
      },
    })
  })
}

/** 异步清空全部数据 */
export const asyncClearStorage = () => {
  return new Promise((resolve) => {
    wx.clearStorage({
      key,
      complete(res) {
        resolve(res)
      },
    })
  })
}

封装网络请求

request.js

js 复制代码
class WxRequest {
  /** 默认请求参数 */
  defaultOpts = {
    baseURL: "https://gmall-prod.atguigu.cn/mall-api", //域名
    url: "", // 请求路径
    data: null, // 请求参数
    method: "GET", // 请求方法
    header: {
      // 请求头
      "Content-type": "application/json",
    },
    timeout: 60000, // 超时时间
    isLoading: true, // 是否显示loading
  }

  /** 拦截器 */
  interceptors = {
    // 请求拦截器,发送请求前,可以对请求参数进行更改
    request: (config) => config,
    // 响应拦截器,服务器响应后,可以对数据进行逻辑处理
    response: (response) => response,
  }

  /** 数组,存放请求标识 */
  queue = []

  constructor(options = {}) {
    this.defaultOpts = Object.assign({}, this.defaultOpts, options)
  }

  request(options) {
    this.timeId && clearTimeout(this.timeId)

    options.url = this.defaultOpts.baseURL + options.url
    options = { ...this.defaultOpts, ...options }

    // 使用请求拦截器
    options = this.interceptors.request(options)

    // 如果数组为空,则显示loading
    if (options.isLoading) {
      this.queue.length === 0 && this.showLoading()
      this.queue.push("request")
    }

    return new Promise((resolve, reject) => {
      wx.request({
        ...options,
        success: (res) => {
          console.log("success", res)
          if (res.statusCode === 200) {
            // 第一个参数:目标对象;第二个参数:服务器响应数据;第三个参数:请求配置
            const mergeRes = Object.assign({}, res, {
              config: options,
              isSuccess: true,
            })
            resolve(this.interceptors.response(mergeRes))
          } else {
            wx.showToast({
              title: "服务器异常",
              icon: "error",
            })
          }
        },
        fail: (err) => {
          console.log("fail", err)
          const mergeErr = Object.assign({}, err, {
            config: options,
            isSuccess: false,
          })
          reject(this.interceptors.response(mergeErr))
        },
        complete: () => {
          if (options.isLoading) {
            this.queue.pop()
            this.queue.length === 0 && this.queue.push("request")
            this.timeId = setTimeout(() => {
              this.queue.pop()
              this.queue.length === 0 && this.hideLoading()
              clearTimeout(this.timeId)
            }, 1)
          }
        },
      })
    })
  }

  /** 封装GET请求 */
  get(url, data = {}, config = {}) {
    return this.request(Object.assign({ url, data, method: "GET" }, config))
  }

  /** 封装POST请求 */
  post(url, data = {}, config = {}) {
    return this.request(Object.assign({ url, data, method: "POST" }, config))
  }

  /** 并发请求 */
  all(...promise) {
    console.log("all", promise)
    return Promise.all(promise)
  }

  showLoading() {
    wx.showLoading({
      title: "加载中",
    })
  }

  hideLoading() {
    wx.hideLoading()
  }
}

export default WxRequest

http.js

js 复制代码
import WxRequest from "./request"

// 实例化
const instance = new WxRequest()

// 配置请求拦截器
instance.interceptors.request = (config) => {
  const token = wx.getStorageSync("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:
      wx.showModal({
        title: "提示",
        content: "鉴权失败,请重新登录",
        complete: (res) => {
          if (res.confirm) {
            wx.clearStorage()
            // TODO 跳转登录页面
          }
        },
      })
      return Promise.reject(response)
    default:
      wx.showToast({
        title: "程序出现异常",
        icon: "error",
      })
      return Promise.reject(response)
  }
}

export default instance
相关推荐
.生产的驴5 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
汤姆yu11 小时前
基于微信小程序的乡村旅游系统
微信小程序·旅游·乡村旅游
曲辒净11 小时前
微信小程序实现二维码海报保存分享功能
微信小程序·小程序
oil欧哟1 天前
🤔认真投入一个月做的小程序,能做成什么样子?有人用吗?
前端·vue.js·微信小程序
汤姆yu1 天前
基于微信小程序的消防隐患在线举报系统
微信小程序·小程序·消防隐患
郏国上1 天前
微信小程序的消息头增加的字段不能有下滑线,字段大写字母自动转换消息字母
微信小程序·小程序·
從南走到北1 天前
JAVA数字人创作文案视频链接提取数字人源码小程序+公众号+APP+H5
微信小程序·小程序·微信公众平台
FZUGO2 天前
EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 3
java·微信小程序·sprint
V+zmm101342 天前
高校教师成果管理小程序的设计与实现springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
蜂鸟视图fengmap2 天前
蜂鸟云平台2024年1月重大更新:JavaScript SDK v3.1.4 & 微信小程序SDK v0.9.4 亮点解析
开发语言·前端·javascript·微信小程序·ecmascript·主题编辑器·蜂鸟视图