当前位置: 首页 > article >正文

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

文章目录

  • 微信小程序-封装通用模块
    • 封装toast和modal
    • 封装storage
    • 封装网络请求

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

封装toast和modal

/** 提示消息框 */
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

/** 同步存储数据 */
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

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

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

http://www.kler.cn/news/356868.html

相关文章:

  • Mac 远程 Windows 等桌面操作系统工具 Microsoft Remote Desktop for Mac 下载安装详细使用教程
  • 《仓库猎手模拟》风灵月影游戏辅助使用教程
  • 数据库原理与应用(基于MySQL):实验六数据查询
  • 【Golang】Go语言http编程底层逻辑实现原理与实战
  • 大数据治理:技术挑战与解决方案
  • 免杀对抗—内存加载UUID标识IPV4地址MAC地址
  • webpack自定义插件 ChangeScriptSrcPlugin
  • 结合seata和2PC,简单聊聊seata源码
  • 暴雨讲堂:AI已成为交叉学科科研工具
  • 监督学习、无监督学习、半监督学习、强化学习、迁移学习、集成学习分别是什么对应什么应用场景
  • Facebook Marketplace无法使用的原因
  • 【Bootstrap】bootstrap-table 的打印按钮功能正常但缺失图标
  • python爬虫加解密分析及实现
  • OSI参考模型与TCP/IP模型
  • 《深空彼岸》TXT完整版下载,知轩藏书校对版!
  • QGIS的入门(实习指导)
  • Android SELinux——其他常见策略⽂件(十一)
  • Go语言基础学习(Go安装配置、基础语法)
  • SpringBoot实现桂林旅游的智能推荐
  • LED显示屏与手机连接:简单便捷的操作指南