uni-app如何封装通用的filters.js工具类

风晨大大_2855

风晨大大_2855

2026-09-09

165人浏览

原创

uni-app全局filter必须在main.js中显式注册,否则静默失效;需按(value, ...args)签名编写纯同步函数,禁止调用uni、this等跨端不兼容api,且须导出为对象以便批量注册。

uni-app如何封装通用的filters.js工具类

uni-app全局filter必须在main.js里注册,否则静默失效

只新建filters.js文件、写好函数,但没在main.js中调用Vue.filter(),所有页面里的{{ value | myFilter }}都不会生效——不报错,也不渲染。这是因为 Vue 2(uni-app 当前主流版本)的 filter 是构造函数级的全局注册机制,不会自动扫描或加载文件。

常见错误包括:

  • 把filters.js放在utils/或common/目录下就以为“放对位置就能用”
  • 在App.vue的created钩子或某个页面里调用Vue.filter()——此时 Vue 实例已创建,注册太晚,无效

✅ 正确做法:在main.js最顶部 import 过滤器对象,再循环注册:

import filters from '@/utils/filters'
Object.keys(filters).forEach(key => {
  Vue.filter(key, filters[key])
})

filter函数签名必须是(value, ...args),不能省略value

模板中{{ time | formatDate('MM/dd/yyyy') }}传入的time会作为第一个参数自动注入。如果过滤器函数漏掉这个value,比如写成(format) => {...},结果就是value为undefined,后续new Date(undefined)返回Invalid Date,最终渲染为空字符串或NaN。

务必遵守签名规范:

  • 第一个参数必须是被处理的原始值(value),不可省略、不可重命名
  • 后续参数才对应模板中管道符后的传参,如| phoneMask(3, 4) → (value, startLen = 3, endLen = 4)
  • 所有参数都要做防御性判断:空字符串、null、0、undefined都可能传进来

示例(安全的时间格式化):

export default {
  formatDate(value, format = 'yyyy-MM-dd') {
    if (!value) return ''
    const d = new Date(value)
    if (isNaN(d.getTime())) return ''
    // ... 格式化逻辑
  }
}

filter内禁止调用uni、this、document等平台专属API

过滤器运行时没有组件实例上下文,this为undefined,uni未注入,document在小程序/APP端不存在。任何试图在 filter 里调用uni.getSystemInfoSync()、uni.showToast()或document.querySelector()的行为,都会在非 H5 平台直接报错或静默失败。

Browser Js
Browser Js

轻量级CDP浏览器控制,适用于AI代理。相较于内置浏览器工具,token消耗降低3‑10倍,仅在浏览时使用。

下载

能做的只有纯计算类操作:

  • 字符串处理(截取、替换、大小写转换)
  • 数字格式化(千分位、小数点、百分比)
  • 日期格式化(仅基于Date原生 API)
  • 状态码映射(如1 → '待付款')

跨端不兼容的典型误用:

// ❌ 错误:uni未定义,小程序里直接崩溃
phoneMask(value) {
  const info = uni.getSystemInfoSync() // 报错!
  return value.replace(/^(d{3})d+(d{4})$/, '$1****$2')
}
<p>// ✅ 正确:只做纯逻辑
phoneMask(value, startLen = 3, endLen = 4) {
if (!value || typeof value !== 'string') return ''
const reg = new RegExp(<code>^(\d{${startLen}})\d+(\d{${endLen}})$</code>)
return value.replace(reg, <code>$1****$2</code>) || value
}
</p>

推荐的filters.js结构:按功能拆分 + 导出对象

不要把所有 filter 写成一个大函数,也不要用export default function单个导出——那样无法批量注册。应统一导出一个 plain object,键名为 filter 名,值为函数。

建议目录结构:src/utils/filters.js

export default {
  // 时间格式化
  formatDate(value, format = 'yyyy-MM-dd') { /* ... */ },
<p>// 手机号脱敏
phoneMask(value, startLen = 3, endLen = 4) { /<em> ... </em>/ },</p><p>// 金额千分位
toCurrency(value, digits = 2) { /<em> ... </em>/ },</p><p>// 状态映射
orderStatus(value) {
const map = { 1: '待付款', 2: '待发货', 3: '配送中', 4: '已完成' }
return map[value] || '未知状态'
}
}
</p>

注意:所有函数必须是同步纯函数,不能含await、Promise、setTimeout等异步操作——filter 不支持异步返回。

真正容易被忽略的一点:filter 的执行时机在模板编译阶段,它不参与响应式依赖收集。如果 value 是响应式数据,filter 函数本身不会触发重新执行——但 Vue 会自动在 value 变化时重跑整个 filter,所以你不需要手动处理响应式逻辑;但千万别在里面搞副作用(比如发请求、改 state),那会失控。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

uni-app过滤器 uni-app js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5003

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6090

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5618

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

803

5

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

2026.02.13

272

17

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

2026.02.25

500

17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

2026.03.13

351

19

TypeScript 全栈开发进阶指南
TypeScript 全栈开发进阶指南

面向有 JavaScript 基础的开发者,深入讲解 TypeScript 的类型系统与全栈开发实践。

2026.06.03

266

29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习