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

vue2中的过滤器filter

该功能在vue3中已废弃,vue3推荐使用方法或计算属性代替。所以本文主要基于vue2讲解过滤器的常见使用,以及过滤器filter和计算属性computed、方法method的区别。

vue过滤器是什么?

在vue2中,过滤器filter常用于对模板中的数据进行格式化处理。它不改变原始数据,只在渲染时对输出结果进行转换,非常适合处理日期格式化、金额格式化、文本处理等常见需求。

如何使用过滤器filter

  • 使用语法:{{ 数据 | 过滤器名称 }},管道符|表示将左侧数据传入右侧过滤器处理。

  • filter可以挂载在全局使用,也可以在组件内使用。

全局过滤器

挂载在vue中,全局生效,直接在任意组件使用

// main.js
import Vue from 'vue';// 注册全局过滤器:格式化金额
Vue.filter('formatMoney', (value) => {if (!value) return '¥0.00';// 保留两位小数并添加千分位return '¥' + Number(value).toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
});new Vue({render: h => h(App)
}).$mount('#app');-------------------------------任意组件内------------
<template><p>金额:{{ price | formatMoney }}</p>
</template><script>
export default {data() {return { price: 12345.67 };}
};
</script>

组件过滤器

<template><div><!-- 在双花括号中使用 --><p>原始时间:{{ timestamp }}</p><p>格式化后:{{ timestamp | formatDate }}</p><!-- 在v-bind中使用 --><div :title="message | capitalize">鼠标悬停查看</div></div>
</template><script>
export default {data() {return {timestamp: 1620000000000, // 时间戳message: "hello world"};},filters: {// 格式化日期formatDate(value) {if (!value) return "";const date = new Date(value);return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;},// 首字母大写capitalize(value) {if (!value) return "";return value.charAt(0).toUpperCase() + value.slice(1);}}
};
</script>

带参数的过滤器

过滤器可以带参数,但是默认第一个参数是管道符 | 左侧的数据,所以自带的参数实际都从参数2开始。

<template><p>{{ date | formatDate('yyyy-MM-dd HH:mm') }}</p>
</template><script>
export default {data() {return { date: new Date() };},filters: {formatDate(value, format) {if (!value) return "";// 简化版日期格式化(实际项目建议使用moment.js等库)const year = value.getFullYear();const month = (value.getMonth() + 1).toString().padStart(2, '0');const day = value.getDate().toString().padStart(2, '0');const hour = value.getHours().toString().padStart(2, '0');const minute = value.getMinutes().toString().padStart(2, '0');return format.replace('yyyy', year).replace('MM', month).replace('dd', day).replace('HH', hour).replace('mm', minute);}}
};
</script>

链式过滤器

第一个过滤器的结果作为第二个过滤器的参数,第二个过滤器的结果作为第三个过滤器的参数,以此类推,呈现链式结构。

<template><p>{{ text | trim | capitalize }}</p>
</template><script>
export default {data() {return { text: "  hello vue  " };},filters: {trim(value) {return value.trim(); // 去除首尾空格},capitalize(value) {return value.charAt(0).toUpperCase() + value.slice(1);}}
};
</script>
<!-- 输出结果:Hello vue -->

常见场景

1. 日期时间格式化

本示例实现了简单的日期时间格式化,但实际项目中的应用场景可能会更复杂,所以更推荐使用moment.jsday.js库哦~

想了解day.js库可以看博主另一篇点这里看

// 全局过滤器:基于day.js的日期格式化
import Vue from 'vue';
import dayjs from 'dayjs';Vue.filter('formatDate', (value, format = 'YYYY-MM-DD') => {return dayjs(value).format(format);
});

2. 文本处理

  • 大小写转换
  • 文本截断(超出长度显示省略号)
  • HTML 转义(防止 XSS 攻击)
filters: {// 文本截断truncate(value, length = 10) {if (!value) return "";return value.length > length ? value.slice(0, length) + '...' : value;},// HTML转义escapeHtml(value) {return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');}
}

3. 状态转换

将后端返回的状态码转换为可读性强的文本。

<template>//此处状态显示:  已发货<p>订单状态:{{ orderStatus | statusText }}</p>
</template><script>
export default {data() {return { orderStatus: 2 };},filters: {statusText(status) {const statusMap = {0: '待支付',1: '已支付',2: '已发货',3: '已完成',4: '已取消'};return statusMap[status] || '未知状态';}}
};
</script>

4. 数字格式化

  • 金额单位转换(分→元)
  • 百分比显示
  • 数字补零
filters: {// 分转元并格式化centToYuan(cent) {return '¥' + (cent / 100).toFixed(2);},// 转换为百分比toPercentage(value) {return (value * 100).toFixed(1) + '%';}
}

过滤器 vs 计算属性 vs 方法

在看了以上内容后会发现,filter能实现的功能,computed和method基本都能做到(可能这就是vue3将其废弃的原因吧)

但是三者有什么区别呢?在各场景该如何选择?

特性过滤器计算属性方法
用途数据格式化复杂数据处理 / 依赖缓存通用逻辑处理
模板中使用{{ data | filter }}{{ computedProp }}{{ method() }}
缓存无缓存有缓存(依赖不变则复用)无缓存(每次调用重新执行)
参数传递支持(灵活)不支持支持
链式调用支持(通过管道符)需手动组合需手动组合

选择建议:

  • 简单的格式化逻辑(如金额):用过滤器,语法更简洁
  • 依赖多个数据的复杂计算:用计算属性(利用缓存提升性能)
  • 需要频繁复用的复杂逻辑:用方法(更灵活的参数控制)

(如果vue2项目后续有计划要迁移为vue3语法的话,当下也不推荐继续写filter了)


本文到此,欢迎指正!

http://www.dtcms.com/a/307008.html

相关文章:

  • 1+1>2!特征融合如何让目标检测更懂 “场景”?
  • 深入理解数据库事务:从概念到实践
  • 防止飞书重复回调通知分布式锁
  • 白话容器基础(一):进程
  • Mybatis分页查询当前页数据条数大于实际返回的数据条数
  • 拥抱智慧物流时代:数字孪生技术的应用与前景
  • Matplotlib(四)- 图表样式美化
  • Linux日志管理和时钟同步配置指南
  • OneCode3.0 框架深入研究与应用扩展
  • html页面跳转或者a标签锚点跳转,解决页面滚动问题3个(1.从底部开始滚动,2.滚动不到指定锚点位置,3.页面展示不在最上面)
  • MySQL图解索引篇(2)
  • 斯皮尔曼spearman相关系数
  • 25年新算法!基于猛禽的优化算法(BPBO):一种元启发式优化算法,附完整免费MATLAB代码
  • Java反射-动态代理
  • cmake_parse_arguments()构建清晰灵活的 CMake 函数接口
  • 智汇AI,应用领航 | 华宇万象问数入选2025全景赋能典型案例
  • 36、spark-measure 源码修改用于数据质量监控
  • Linux零基础Shell教学全集(可用于日常查询语句,目录清晰,内容详细)(自学尚硅谷B站shell课程后的万字学习笔记,附课程链接)
  • 「Spring Boot + MyBatis-Plus + MySQL 一主两从」读写分离实战教程
  • Linux 中,命令查看系统版本和内核信息
  • Linux 系统原理深度剖析与技术实践:从内核架构到前沿应用
  • 【选型】HK32L088 与 STM32F0/L0 系列 MCU 参数对比与选型建议(ST 原厂 vs 国产芯片)(单片机选型主要考虑的参数与因素)
  • 【python】列表“*”方式与推导式方式初始化区别
  • 数据结构——单链表1
  • 【WRF-Chem】EDGAR 排放数据处理:分部门合并转化为二进制(Python全代码)
  • RAG实战指南 Day 27:端到端评估框架实现
  • CSS-in-JS 动态主题切换与首屏渲染优化
  • 1.5.Vue v-for 和 指令修饰符
  • COZE 开源,新一代 AI Agent 本地部署一条龙
  • Excel文件解析