首页 > 其他分享 >小兔鲜儿 uniapp - uni.request 请求封装 2月摸鱼计划03

小兔鲜儿 uniapp - uni.request 请求封装 2月摸鱼计划03

时间:2024-02-05 22:31:57浏览次数:30  
标签:03 vue uniapp 鲜儿 eslint res uni true options

uni.request 请求封装

添加请求和上传文件拦截器

uniapp 拦截器uni.addInterceptor

接口说明接口文档

实现步骤

  1. 基础地址
  2. 超时时间
  3. 请求头标识
  4. 添加 token

参考代码

// src/utils/http.ts
const httpInterceptor = {
  // 拦截前触发
  invoke(options: UniApp.RequestOptions) {
    // 1. 非 http 开头需拼接地址
    if (!options.url.startsWith('http')) {
      options.url = baseURL + options.url
    }
    // 2. 请求超时
    options.timeout = 10000
    // 3. 添加小程序端请求头标识
    options.header = {
      ...options.header,
      'source-client': 'miniapp',
    }
    // 4. 添加 token 请求头标识
    const memberStore = useMemberStore()
    const token = memberStore.profile?.token
    if (token) {
      options.header.Authorization = token
    }
  },
}

// 拦截 request 请求
uni.addInterceptor('request', httpInterceptor)
// 拦截 uploadFile 文件上传
uni.addInterceptor('uploadFile', httpInterceptor)

封装 Promise 请求函数

实现步骤

  1. 返回 Promise 对象
  2. 成功 resolve
  1. 提取数据
  2. 添加泛型
  1. 失败 reject
  2. 401 错误
  3. 其他错误
  4. 网络错误

参考代码

/**
 * 请求函数
 * @param  UniApp.RequestOptions
 * @returns Promise
 *  1. 返回 Promise 对象
 *  2. 获取数据成功
 *    2.1 提取核心数据 res.data
 *    2.2 添加类型,支持泛型
 *  3. 获取数据失败
 *    3.1 401错误  -> 清理用户信息,跳转到登录页
 *    3.2 其他错误 -> 根据后端错误信息轻提示
 *    3.3 网络错误 -> 提示用户换网络
 */
type Data<T> = {
  code: string
  msg: string
  result: T
}
// 2.2 添加类型,支持泛型
export const http = <T>(options: UniApp.RequestOptions) => {
  // 1. 返回 Promise 对象
  return new Promise<Data<T>>((resolve, reject) => {
    uni.request({
      ...options,
      // 响应成功
      success(res) {
        // 状态码 2xx, axios 就是这样设计的
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 2.1 提取核心数据 res.data
          resolve(res.data as Data<T>)
        } else if (res.statusCode === 401) {
          // 401错误  -> 清理用户信息,跳转到登录页
          const memberStore = useMemberStore()
          memberStore.clearProfile()
          uni.navigateTo({ url: '/pages/login/login' })
          reject(res)
        } else {
          // 其他错误 -> 根据后端错误信息轻提示
          uni.showToast({
            icon: 'none',
            title: (res.data as Data<T>).msg || '请求错误',
          })
          reject(res)
        }
      },
      // 响应失败
      fail(err) {
        uni.showToast({
          icon: 'none',
          title: '网络错误,换个网络试试',
        })
        reject(err)
      },
    })
  })
}

【拓展】代码规范

为什么需要代码规范

如果没有统一代码风格,团队协作不便于查看代码提交时所做的修改。

小兔鲜儿 uniapp - uni.request 请求封装 2月摸鱼计划03_Data

统一代码风格

  • 安装 eslint + prettier
pnpm i -D eslint prettier eslint-plugin-vue @vue/eslint-config-prettier @vue/eslint-config-typescript @rushstack/eslint-patch @vue/tsconfig
  • 新建 .eslintrc.cjs 文件,添加以下 eslint 配置
/* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution')

module.exports = {
  root: true,
  extends: [
    'plugin:vue/vue3-essential',
    'eslint:recommended',
    '@vue/eslint-config-typescript',
    '@vue/eslint-config-prettier',
  ],
  // 小程序全局变量
  globals: {
    uni: true,
    wx: true,
    WechatMiniprogram: true,
    getCurrentPages: true,
    UniApp: true,
    UniHelper: true,
  },
  parserOptions: {
    ecmaVersion: 'latest',
  },
  rules: {
    'prettier/prettier': [
      'warn',
      {
        singleQuote: true,
        semi: false,
        printWidth: 100,
        trailingComma: 'all',
        endOfLine: 'auto',
      },
    ],
    'vue/multi-word-component-names': ['off'],
    'vue/no-setup-props-destructure': ['off'],
    'vue/no-deprecated-html-element-is': ['off'],
    '@typescript-eslint/no-unused-vars': ['off'],
  },
}
  • 配置 package.json
{
  "script": {
    // ... 省略 ...
    "lint": "eslint . --ext .vue,.js,.ts --fix --ignore-path .gitignore"
  }
}
  • 运行
pnpm lint

到此,你已完成 eslint + prettier 的配置。

Git 工作流规范

  • 安装并初始化 husky
pnpm dlx husky-init
  • 安装 lint-staged
pnpm i lint-staged -D
  • 配置 package.json
{
  "script": {
    // ... 省略 ...
  },
  "lint-staged": {
    "*.{vue,ts,js}": ["eslint --fix"]
  }
}
  • 修改 .husky/pre-commit 文件
npm test   // [!code --]
pnpm lint-staged     // [!code ++]

到此,你已完成 husky + lint-staged 的配置。

标签:03,vue,uniapp,鲜儿,eslint,res,uni,true,options
From: https://blog.51cto.com/u_15520592/9613861

相关文章

  • 洛谷题单指南-递推与递归-P1044 [NOIP2003 普及组] 栈
    原题链接:https://www.luogu.com.cn/problem/P1044题意解读:一组数入栈、出栈的方案数,如果了解卡特兰数,此题可以秒杀;如果不了解,也可以通过递归或者递推来解决;最次,可以通过DFS暴搜出方案数,当然对于n个数,一共有n次入栈、n次出栈,一共2n次,每次要么入栈要么出栈,总搜索次数在22n规模,n最......
  • SQL数据库入门03:数据库表的完整性约束、索引与视图的操作
      本文介绍基于MicrosoftSQLServer软件,实现数据库表完整性约束、索引与视图的创建、编辑与删除等操作的方法。(数据库基础(三):完整性约束、索引、视图)  系列文章中示例数据来源于《SQLServer实验指导(2005版)》一书。依据本系列文章的思想与对操作步骤、代码的详细解释,大家用......
  • uniapp 选择城市 根据城市首字母分类排序
     selectCity.vue<template><viewclass="select-city"><viewclass="search"><van-fieldclass="select-input"input-align="left":value="searchVal"placeholder=&......
  • 【2024-02-03】连岳摘抄
    23:59但我相信,能打败黑暗的,不是强大的魔力,而是生活中的小事和微小的爱。                                                 ——托尔金教育离不开考试,考试就只能考智......
  • 20240203
    Android中Service机制基础广播的类型:标准广播(高效,无法截断)、有序广播(同步执行,可以截断,有先后顺序)接收系统广播动态注册监听系统广播BroadcastReceiver的创建方法:新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法。书上的示例,监听系统时间变化的广播,显示通......
  • [office] excel2003创建下拉菜单的方法
    Excel中的下拉菜单具体该如何创建呢?下面是由小编分享的excel2003创建下拉菜单的方法,以供大家阅读和学习。excel2003创建下拉菜单的方法:创建下拉菜单步骤1:首先选择要生成下拉菜单的单元格创建下拉菜单步骤2:点击菜单[数据]->[有效性]创建下拉菜单步骤3:在允许项......
  • 基础03-js
    三、JavaScript1 闭包闭包就是能够读取其他函数内部变量的函数闭包是指有权访问另⼀个函数作用域中变量的函数,创建闭包的最常⻅的方式就是在⼀个函数内创建另⼀个函数,通过另⼀个函数访问这个函数的局部变量,利用闭包可以突破作用链域 闭包的特性: 函数内再嵌套函数内部......
  • ABP-VNext 用户权限管理系统实战03---动态api调用并传递token
    一、使用动态api的目的ABP可以自动创建C#API客户端代理来调用远程HTTP服务(RESTAPIS).通过这种方式,你不需要通过 HttpClient 或者其他低级的HTTP功能调用远程服务并获取数据.现在有两个服务:BackgroundJob服务要调用IdentityManagement服务,并在调用时传递token二、集成步骤1、......
  • A Knight's JourneyC++
    题目看半天看不懂。題目把我恶心坏了。看网上说按字典顺序输出,到底是什么意思半天没搞懂。#include<iostream>#include<string>usingnamespacestd;intd[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};intvisit[8][8]={0};boolDFS(i......
  • 0129-0203部分校赛题解复盘
    vj第一场A题https://codeforces.com/gym/103480/problem/A该题让我们可以从回文串的特点入手,即两个相同的字母便可增加长度2,所以并不用思考该回文串要如何排序出来,而是看有多少对相同的字母,使用map<char,int>来记录字母出现的次数,再计算可以除以2的次数即可。点击查看代码#i......