Vue.js 过滤器详解

Vue.js 过滤器详解

下面我将详细讲解Vue.js中过滤器的语法和使用注意事项,并提供一个完整的演示页面。

过滤器基本概念

在Vue.js中,过滤器(Filters) 是用于文本格式化的功能,可以在双花括号插值和v-bind表达式中使用。过滤器通过管道符(|)指示,主要用于简单的文本转换。

<!-- 基本语法 -->
{{ message | capitalize }}<!-- 链式调用 -->
{{ message | filterA | filterB }}<!-- 带参数的过滤器 -->
{{ date | formatDate('YYYY-MM-DD') }}

过滤器语法详解

1. 全局过滤器定义

Vue.filter('filterName', function(value, ...args) {// 处理逻辑return transformedValue;
});

2. 局部过滤器定义

new Vue({filters: {filterName(value, ...args) {// 处理逻辑return transformedValue;}}
});

3. 使用方式

<!-- 在插值中使用 -->
<p>{{ price | currency }}</p><!-- 在v-bind中使用 -->
<div v-bind:id="rawId | formatId"></div><!-- 链式调用 -->
<p>{{ text | trim | capitalize }}</p><!-- 带参数 -->
<p>{{ now | dateFormat('YYYY年MM月DD日') }}</p>

过滤器注意事项

  1. 过滤器只用于文本转换:适用于简单的文本格式化,不应用于复杂的数据转换
  2. 参数传递
    • 第一个参数始终是管道前的值
    • 后续参数是调用时传入的参数
  3. 链式调用顺序:从左到右执行,前一个过滤器的结果作为后一个过滤器的输入
  4. 返回值:过滤器必须返回一个值
  5. Vue 3的变化:Vue 3中移除了过滤器,官方推荐使用方法或计算属性替代
  6. 性能考虑:避免在过滤器中执行复杂操作,特别是大数据量时
  7. 作用域:过滤器函数内无法访问组件实例(this为undefined)

完整演示示例

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue.js 过滤器详解</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><style>* {box-sizing: border-box;margin: 0;padding: 0;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;}body {background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);min-height: 100vh;padding: 20px;color: #333;}.container {max-width: 1000px;margin: 40px auto;background: rgba(255, 255, 255, 0.95);border-radius: 15px;box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);overflow: hidden;}header {background: linear-gradient(90deg, #3498db, #2c3e50);color: white;padding: 30px 40px;text-align: center;}h1 {font-size: 2.5rem;margin-bottom: 10px;text-shadow: 2px 2px 4px rgba(0,0,0,0.3);}.subtitle {font-size: 1.2rem;opacity: 0.9;max-width: 700px;margin: 0 auto;}.content {display: flex;flex-wrap: wrap;padding: 30px;}.panel {flex: 1;min-width: 300px;padding: 25px;margin: 15px;background: white;border-radius: 10px;box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08);transition: transform 0.3s ease;}.panel:hover {transform: translateY(-5px);}.panel h2 {color: #2c3e50;border-bottom: 2px solid #3498db;padding-bottom: 10px;margin-bottom: 20px;display: flex;align-items: center;}.panel h2 i {margin-right: 10px;color: #3498db;}.example {background: #f8f9fa;border-radius: 8px;padding: 20px;margin: 15px 0;border-left: 4px solid #3498db;}.input-group {margin-bottom: 20px;}label {display: block;margin-bottom: 8px;font-weight: 600;color: #2c3e50;}input, select, textarea {width: 100%;padding: 12px 15px;border: 1px solid #ddd;border-radius: 6px;font-size: 16px;transition: border 0.3s;}input:focus, select:focus, textarea:focus {outline: none;border-color: #3498db;box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.2);}.result {background: #e3f2fd;padding: 15px;border-radius: 8px;margin-top: 15px;min-height: 50px;font-size: 18px;font-weight: 500;color: #0d47a1;}.note {background: #fff8e1;border-left: 4px solid #ffc107;padding: 15px;margin-top: 20px;border-radius: 0 8px 8px 0;}.note h3 {color: #ff9800;margin-bottom: 10px;}.code {background: #2c3e50;color: #ecf0f1;padding: 20px;border-radius: 8px;font-family: 'Courier New', monospace;margin: 15px 0;overflow-x: auto;}.footer {text-align: center;padding: 20px;background: #f8f9fa;color: #6c757d;font-size: 0.9rem;border-top: 1px solid #eee;}.filters-list {display: grid;grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));gap: 15px;margin-top: 20px;}.filter-item {background: #e3f2fd;padding: 15px;border-radius: 8px;border-left: 4px solid #2196f3;}.filter-item h4 {margin-bottom: 8px;color: #0d47a1;}@media (max-width: 768px) {.content {flex-direction: column;}.panel {min-width: 100%;margin: 10px 0;}}</style>
</head>
<body><div id="app"><div class="container"><header><h1>Vue.js 过滤器详解</h1><p class="subtitle">过滤器用于文本格式化,在Vue 2中通过管道符(|)使用。Vue 3中已移除,建议使用计算属性或方法替代。</p></header><div class="content"><div class="panel"><h2><i class="fas fa-filter"></i> 过滤器演示</h2><div class="input-group"><label for="textInput">输入文本:</label><input type="text" id="textInput" v-model="inputText" placeholder="输入文本进行格式化"></div><div class="input-group"><label for="numberInput">输入数值:</label><input type="number" id="numberInput" v-model.number="inputNumber" placeholder="输入数值进行格式化"></div><div class="filters-list"><div class="filter-item"><h4>大写转换</h4><div class="result">{{ inputText | uppercase }}</div></div><div class="filter-item"><h4>首字母大写</h4><div class="result">{{ inputText | capitalize }}</div></div><div class="filter-item"><h4>货币格式化</h4><div class="result">{{ inputNumber | currency }}</div></div><div class="filter-item"><h4>百分比</h4><div class="result">{{ inputNumber | percent }}</div></div><div class="filter-item"><h4>反转文本</h4><div class="result">{{ inputText | reverse }}</div></div><div class="filter-item"><h4>截断文本</h4><div class="result">{{ inputText | truncate(20) }}</div></div><div class="filter-item"><h4>日期格式化</h4><div class="result">{{ currentDate | dateFormat('YYYY年MM月DD日') }}</div></div><div class="filter-item"><h4>链式调用</h4><div class="result">{{ inputText | uppercase | truncate(15) }}</div></div></div></div><div class="panel"><h2><i class="fas fa-code"></i> 过滤器定义</h2><div class="example"><h3>全局过滤器</h3><div class="code">
// 大写转换过滤器
Vue.filter('uppercase', function(value) {if (!value) return '';return value.toString().toUpperCase();
});// 货币格式化过滤器
Vue.filter('currency', function(value) {if (value === null || value === undefined) return '';return '¥' + value.toFixed(2);
});</div></div><div class="example"><h3>局部过滤器</h3><div class="code">
new Vue({filters: {// 首字母大写capitalize: function(value) {if (!value) return '';value = value.toString();return value.charAt(0).toUpperCase() + value.slice(1);},// 带参数的截断过滤器truncate: function(value, length) {if (!value) return '';if (value.length <= length) return value;return value.substring(0, length) + '...';}}
});</div></div><div class="example"><h3>带参数的过滤器</h3><div class="code">
// 日期格式化过滤器
Vue.filter('dateFormat', function(value, format) {if (!value) return '';const date = new Date(value);const year = date.getFullYear();const month = (date.getMonth() + 1).toString().padStart(2, '0');const day = date.getDate().toString().padStart(2, '0');return format.replace('YYYY', year).replace('MM', month).replace('DD', day);
});</div></div><div class="note"><h3><i class="fas fa-exclamation-triangle"></i> 重要注意事项</h3><ul><li>过滤器只用于文本格式化,不改变原始数据</li><li>过滤器函数应保持纯净,不产生副作用</li><li>过滤器不能访问组件实例(this为undefined)</li><li>Vue 3中已移除过滤器功能,建议使用方法或计算属性替代</li><li>复杂逻辑应使用计算属性而非过滤器</li><li>过滤器可以链式调用,顺序从左到右</li><li>第一个参数始终是管道符前的值</li></ul></div></div></div><div class="footer"><p>Vue.js 过滤器演示 | 在实际项目中考虑Vue版本兼容性</p></div></div></div><script>// 全局过滤器定义Vue.filter('uppercase', function(value) {if (!value) return '';return value.toString().toUpperCase();});Vue.filter('reverse', function(value) {if (!value) return '';return value.toString().split('').reverse().join('');});Vue.filter('currency', function(value) {if (value === null || value === undefined) return '';return '¥' + value.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');});Vue.filter('percent', function(value) {if (value === null || value === undefined) return '';return (value * 100).toFixed(2) + '%';});Vue.filter('dateFormat', function(value, format) {if (!value) return '';const date = new Date(value);const year = date.getFullYear();const month = (date.getMonth() + 1).toString().padStart(2, '0');const day = date.getDate().toString().padStart(2, '0');return format.replace('YYYY', year).replace('MM', month).replace('DD', day);});new Vue({el: '#app',data: {inputText: 'Vue过滤器使用示例',inputNumber: 1234.567,currentDate: new Date()},filters: {// 局部过滤器:首字母大写capitalize: function(value) {if (!value) return '';value = value.toString();return value.charAt(0).toUpperCase() + value.slice(1);},// 局部过滤器:截断文本truncate: function(value, length) {if (!value) return '';if (value.length <= length) return value;return value.substring(0, length) + '...';}}});</script><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
</body>
</html>

关键知识点总结

  1. 过滤器定义

    • 全局过滤器使用Vue.filter()定义
    • 局部过滤器在组件选项的filters属性中定义
  2. 过滤器使用

    • 通过管道符 | 使用
    • 可以链式调用:{{ value | filterA | filterB }}
    • 可以传递参数:{{ value | filter(arg1, arg2) }}
  3. 过滤器特点

    • 第一个参数是管道符前的值
    • 必须返回一个值
    • 不改变原始数据,只做格式化展示
    • 不能访问组件实例(this为undefined)
  4. Vue 3的变更

    • Vue 3中已移除过滤器
    • 替代方案:使用计算属性或方法
    • 示例:{{ formatCurrency(price) }}
  5. 最佳实践

    • 用于简单文本格式化
    • 复杂逻辑使用计算属性
    • 保持过滤器函数纯净(无副作用)
    • 考虑向后兼容性(Vue 3迁移)

这个演示页面展示了Vue 2中过滤器的各种用法,同时提供了Vue 3的迁移建议,帮助开发者更好地理解和应用过滤器功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911924.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【iOS】iOS崩溃总结

【iOS】iOS崩溃总结 一、前言 之前写了一篇博文《【Flutter】程序报错导致的灰屏总结》&#xff0c;浏览量、收藏率和点赞量还挺高&#xff0c;还被收录了&#xff0c;就想着总结一下iOS崩溃&#xff0c;这个也是在iOS面试中经常被问到的。 在 iOS 开发过程中&#xff0c;导致…

机器学习:特征向量与数据维数概念

特征向量与数据维数概念 一、特征向量与维数的定义 特征向量与特征类别 在机器学习和数据处理中&#xff0c;每个样本通常由多个特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一张图片的特征可能包括颜色、形状、纹理等&#xff1b;一个客户的特征可能包括年龄…

开发基于Jeston Orin Nx 开发版 16G的实现

一、基本配置 1.配置参数 密码&#xff1a;yahboom Ubuntu 20.04版本、python3.8、CUDA11.4、cuDNN8.6、TensorRT8.5、Jetpack5.1.1、Opencv4.5.4版本 终端输入命令&#xff1a;sudo jtop 其中Jetpack是英伟达提供的专门供它自己的嵌入式计算机平台使用的人工智能包。 终…

【技术分享】XR技术体系浅析:VR、AR与MR的区别、联系与应用实践

XR技术体系浅析&#xff1a;VR、AR与MR的区别、联系与应用实践 作者&#xff1a;EQ 雪梨蛋花汤 本文是技术分享文档&#xff0c;浅析VR&#xff08;虚拟现实&#xff09;、AR&#xff08;增强现实&#xff09;、MR&#xff08;混合现实&#xff09;的定义、特性、技术演进路线&…

R语言入门课| 05 一文掌握R语言常见数据类型

视频教程 大家可以先做一做R语言基础小测验&#xff0c;看看自己是否需要跟我们5.5h入门R语言的课程。 先上教程视频&#xff0c;B站同步播出&#xff1a; https://www.bilibili.com/video/BV1miNVeWEkw 完整视频回放和答疑服务可见&#xff1a;5.5h入门R语言 本节课程视频…

vRDMA 发布,助力云上 VPC 内高性能通信

资料来源&#xff1a;火山引擎-开发者社区 近日&#xff0c;火山引擎基于部分云服务器实例规格邀测发布 vRDMA 特性&#xff0c;提供云上 VPC 内大规模 RDMA 加速能力&#xff0c;可兼容传统 HPC 应用、AI 应用以及传统 TCP/IP 应用&#xff0c;降低大众化场景的适配门槛&#…

Win10安装dify

一、win10虚拟化设置&#xff0c;控制面板中开启如下三个服务 二、检查确认wls服务开启 设置自动启动并启动 确认服务开启 bcdedit 是否为auto&#xff0c;如果不是&#xff0c;设置为auto bcdedit /set hypervisorlaunchtype autocpu是否为虚拟化 更新wsl wsl --update二 …

【ai学习笔记】GitLab

CI/CD&#xff08;持续集成/持续交付&#xff09;是现代软件开发中的关键实践&#xff0c;通过自动化工具可以大幅提升开发效率和软件质量。下面为你介绍CI/CD的核心概念、常用工具以及示例配置&#xff1a; 1. CI/CD 核心概念 持续集成&#xff08;CI&#xff09;&#xff1…

Solidity 从 0 到 1 |Web3 开发入门免费共学营

开启你的 Web3 开发之旅&#xff0c;从 Sonic 开始&#xff01; 想进入区块链开发的世界&#xff0c;却不知道从哪里开始&#xff1f;选择对的语言和平台&#xff0c;才能事半功倍。 Solidity 是 Web3 中最主流、最通用的智能合约开发语言&#xff0c;被广泛应用于以太坊及其…

【unitrix】 4.4 类型级整数比较系统(cmp.rs)

一、源码 这段代码实现了一个类型级别的整数比较系统&#xff0c;允许在编译时进行整数比较操作。它定义了一套类型来表示比较结果&#xff0c;并为不同类型的整数实现了比较逻辑。 use core::cmp::Ordering; use core::default::Default; use crate::sealed::Sealed; use cr…

2025年渗透测试面试题总结-2025年HW(护网面试) 14(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. SQL注入原理 &#x1f4a5; 2. XXE攻击&#xff08;XML外部实体注入&#xff09; &#x1f9e9; 3. SQ…

Android开发根据滑动距离标题栏进行渐变

Android开发根据滑动距离标题栏进行渐变 假设滑动控件是NestedScrollView。 先监听NestedScrollView的滑动距离&#xff1a; nslv_preview_me.setOnScrollChangeListener(object :NestedScrollView.OnScrollChangeListener{override fun onScrollChange(v: NestedScrollView…

高中成绩可视化平台开发笔记

高中成绩可视化平台&#xff08;1&#xff09; 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台&#xff0c;旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换&#xff0c;并提供多个维度的图…

自动化按需导入组件库的工具rust版本完成开源了

背景 当我为每个Vue项目使用ui组件库的时候&#xff0c;都会使用按需导入的方式来使用ui组件库。但是每次按需导入&#xff0c;不可避免的就需要做以下三步。我们以element plus ui组件库为例。 1. 安装依赖 第一步&#xff0c;当然是需要安装依赖。命令如下: pnpm add unp…

Linux内核中TCP分段的核心机制:tcp_fragment函数解析

引言:TCP分段的必要性 在TCP/IP协议栈中,MSS(最大分段大小) 限制了单次传输的数据量。当应用层发送的数据超过当前路径的MSS时,内核必须执行分段操作。tcp_fragment函数正是Linux内核中处理TCP分段的核心机制,它巧妙地在协议合规性、内存安全和性能效率之间取得平衡。 一…

【赵渝强老师】OceanBase OBServer节点的SQL层

OceanBase OBServer节点的SQL层将用户的SQL请求转化成对一个或多个Tablet的数据访问。SQL层会按照以下顺序经过一系列组件来处理一个SQL&#xff1a; Parser -->Resolver-->Transformer-->Optimizer-->CodeGenerator-->Executor。视频讲解如下 【赵渝强老师】O…

从“高配”到“普惠”,黑芝麻智能携手Nullmax打造辅助驾驶主流量产方案

近日&#xff0c;黑芝麻智能携手Nullmax打造的辅助驾驶主流量产方案正式发布。该方案面向8-15万元级别主流车型&#xff0c;基于单颗黑芝麻智能武当C1236跨域计算芯片&#xff0c;集成Nullmax全栈自研的软件技术架构&#xff0c;结合领先的视觉感知算法&#xff0c;打造高性能辅…

信息安全认证体系全解析:从资质证明到行业准入的实践指南

Hello&#xff01;大家好&#xff0c;小编是一名专注IT领域的资深探索家&#xff0c;大家发现了吗&#xff1f;现在刷招聘软件&#xff0c;国企安全岗必标 "CISP 优先"&#xff0c;外企招聘悄悄写着 "CISSP 加分"—— 这些带字母的证书到底是啥&#xff1f…

优雅地创建实体类——Builder 链式调用

我们来看以下的代码。改造前构造实体类用重载构造器或用 setter 对变量进行赋值&#xff0c;一旦变量变多则需要对每个变量进行 set 赋值&#xff0c;并且有可能会赋值错对象。 private static void test() {//1.构造器赋值Task task1 new Task("2023000000009439"…

如何轻松将照片从 iPhone 传输到 Android?

从 iPhone 换到 Android 手机后&#xff0c;你肯定不想丢掉珍贵的照片回忆吧&#xff1f;好在&#xff0c;本文分享了 6 种有效的解决方案&#xff0c;教你如何轻松地将照片从 iPhone 传输到 Android。 第 1 部分&#xff1a;如何通过 iReaShare Phone Transfer 将照片从 iPhon…