无所不能的uniapp拦截器

无所不能的uniapp拦截器-uni.addInterceptor

拦截器能做什么?

uni.addInterceptoruni-app 框架中的一个 API,用于为特定的异步 API 方法添加拦截器。拦截器可以在方法执行前或执行后插入自定义逻辑,比如权限校验、日志记录、数据预处理等。 附上官方文档链接

参数名 类型 必填 默认值 说明 平台差异说明
invoke Function 拦截前触发
returnValue Function 方法调用后触发,处理返回值
success Function 成功回调拦截
fail Function 失败回调拦截
complete Function 完成回调拦截

项目实战

  • uni.request拦截器
  • 登录校验拦截器
  • uni.setStorage数据预处理
  • 隐私权限判断、引导

uni.request拦截器

ts 复制代码
const BASE_URL = 'https://www.example.com/'

const httpInterceptor: UniNamespace.InterceptorOptions = {
  invoke(args) {
    // request 触发前拼接 url
    args.url = BASE_URL + args.url
  },
  success(result) {
    console.log('interceptor-success',result)
    // 请求成功,但接口报错等情况上报
    if(result.data.code === xxx){
        errorReport(result.data.msg)
    }
  },
  fail(err) {
    console.log('interceptor-fail',err)
    // 请求失败等情况上报
    errorReport()
  },
  complete(res) {
    console.log('interceptor-complete',res)
  }
}
// 进行错误上报
function errorReport(errMsg?: string){
    uni.showToast({
      icon: "none",
      title: errMsg || "网络错误,换个网络试试",
    });
    customReport({
        msg: 'xxxx'
    })
}
ts 复制代码
export const requestInterceptor = {
  install() {
    // 拦截 request 请求
    uni.addInterceptor("request", httpInterceptor);
    // 拦截 uploadFile 文件上传
    uni.addInterceptor("uploadFile", httpInterceptor);
  },
};

登录校验拦截器

ts 复制代码
const loginRoute = "/pages/login/index";

let needLoginPages: string[] = [
 "/pages/order/index",
];

/**
* 判断是否登录
*/
export function isLogged(): boolean {
 return false;
}

// 黑名单登录拦截器 - (适用于大部分页面不需要登录,少部分页面需要登录)
const navigateToInterceptor: UniNamespace.InterceptorOptions = {
 // 注意,这里的url是 '/' 开头的,如 '/pages/index/index',跟 'pages.json' 里面的 path 不同
 invoke({ url }: { url: string }) {
   // console.log(url) 
   const path = url.split("?")[0];
   const isNeedLogin = needLoginPages.includes(path);
   if (!isNeedLogin) {
     return true;
   }
   const hasLogin = isLogged();
   if (hasLogin) {
     return true;
   }
   goLogin(url);
   return false;
 },
};

function goLogin(redirect: string = "") {
 uni.navigateTo({
   url: `${loginRoute}?redirect=${encodeURIComponent(redirect)}`,
 });
}

export const routeInterceptor = {
 install() {
   uni.addInterceptor("navigateTo", navigateToInterceptor);
   uni.addInterceptor("reLaunch", navigateToInterceptor);
   uni.addInterceptor("redirectTo", navigateToInterceptor);
   uni.addInterceptor("switchTab", navigateToInterceptor);
 },
};

uni.setStorage数据预处理

ts 复制代码
// 这是个数据处理函数
function processingData(){
}

const storage: UniNamespace.InterceptorOptions = {
  invoke(args) {
    console.log('存储数据前:', args);
    args.data = processingData(args.data); 
    console.log('处理后的数据:', args.data);
  },
  success() {
    console.log('数据存储成功');
  },
  fail(err) {
    console.error('数据存储失败:', err);
  }
}
ts 复制代码
export const storageInterceptor = {
  install() {
    uni.addInterceptor("setStorage", storage);
  },
};
借助拦截器修复快手小程序平台的一个bug
ts 复制代码
const setStorageInterceptor: UniNamespace.InterceptorOptions = {
  invoke(args: { data: any }) {
    // console.log(args, "========args=======");
    // #ifdef MP-KUAISHOU
    args.data = JSON.parse(JSON.stringify(args.data));
    // #endif
  },
  success(args) {
    // console.log(args, "========success=======");
  },
  fail(err) {
    // console.log(err, "========fail=======");
  },
};
/**
 * 解决快手小程序setStorage不支持proxy对象的问题
 * */
export const KuaiShouSetStorageProxyFixInterceptor = {
  install() {
    // 拦截 setStorage
    uni.addInterceptor("setStorage", setStorageInterceptor);
  },
};

隐私权限判断、引导

开发中......

相关推荐
天天扭码27 分钟前
零基础 | 入门前端必备技巧——使用 DOM 操作插入 HTML 元素
前端·javascript·dom
咖啡虫1 小时前
css中的3d使用:深入理解 CSS Perspective 与 Transform-Style
前端·css·3d
拉不动的猪1 小时前
设计模式之------策略模式
前端·javascript·面试
旭久1 小时前
react+Tesseract.js实现前端拍照获取/选择文件等文字识别OCR
前端·javascript·react.js
独行soc1 小时前
2025年常见渗透测试面试题-红队面试宝典下(题目+回答)
linux·运维·服务器·前端·面试·职场和发展·csrf
uhakadotcom2 小时前
Google Earth Engine 机器学习入门:基础知识与实用示例详解
前端·javascript·面试
麓殇⊙2 小时前
Vue--组件练习案例
前端·javascript·vue.js
outstanding木槿2 小时前
React中 点击事件写法 的注意(this、箭头函数)
前端·javascript·react.js
会点php的前端小渣渣2 小时前
vue的计算属性computed的原理和监听属性watch的原理(新)
前端·javascript·vue.js
_一条咸鱼_3 小时前
深入解析 Vue API 模块原理:从基础到源码的全方位探究(八)
前端·javascript·面试