第一阶段:Vue 基础入门(第 11 天)

好的,我们来详细梳理一下 Vue 中的过滤器 (filter)。

Vue 过滤器 (filter)

过滤器是 Vue 提供的一种用于格式化文本的机制。它可以在两个地方使用:

  1. 插值表达式 ({``{ }})
  2. v-bind 指令表达式

过滤器的主要目的是将原始数据转换成更符合展示需求的格式,而无需修改原始数据本身。它是一种增强数据展示可读性和复用性的优雅方式。

核心知识点
  1. 过滤器的概念

    • 本质是一个函数

    • 它接收一个值(管道符 | 前面的表达式结果)作为其第一个参数

    • 它可以接收额外的参数

    • 它返回处理后的值(格式化后的字符串或其他类型)。

    • 使用管道符 | 将数据传递给过滤器:

      html 复制代码
      <!-- 在插值中 -->
      {{ message | capitalize }} <!-- 单个过滤器 -->
      {{ price | currency('¥') }} <!-- 带参数的过滤器 -->
      {{ date | formatDate('YYYY-MM-DD') | localize }} <!-- 链式调用 -->
      
      <!-- 在 v-bind 中 -->
      <div v-bind:id="rawId | formatId"></div>
  2. 过滤器的分类

    • 全局过滤器 :通过 Vue.filter() 定义,可以在所有 Vue 实例和组件中使用。
    • 局部过滤器 :在 Vue 实例或组件的 filters 选项中定义,仅能在该实例或组件及其子组件中使用。
  3. 全局过滤器的定义

    • 使用 Vue.filter(name, function) 方法定义。
    • name:过滤器的名称。
    • function:过滤器函数。第一个参数是待处理的值,后续参数是调用时传入的参数。
    javascript 复制代码
    // 定义一个将字符串首字母大写的全局过滤器
    Vue.filter('capitalize', function (value) {
      if (!value) return ''
      value = value.toString()
      return value.charAt(0).toUpperCase() + value.slice(1)
    })
  4. 局部过滤器的定义

    • 在 Vue 实例或组件的 filters 选项中定义。
    • 选项是一个对象,键是过滤器名,值是过滤器函数。
    javascript 复制代码
    new Vue({
      // ... 其他选项
      filters: {
        // 定义一个将数字转为两位小数的局部过滤器
        toFixedTwo: function (value) {
          if (typeof value !== 'number') return value
          return value.toFixed(2)
        }
      }
    })
  5. 过滤器的传参

    • 过滤器函数可以接收多个参数。
    • 第一个参数 始终是管道符 | 前面的原始值。
    • 后续参数是在调用过滤器时传递的参数。
    javascript 复制代码
    Vue.filter('formatDate', function (value, formatStr) {
      // value 是原始日期值 (如时间戳)
      // formatStr 是传入的格式化字符串参数 (如 'YYYY-MM-DD')
      // ... 使用 day.js 或 moment.js 等库进行格式化
      return formattedDateString
    })
    html 复制代码
    {{ timestamp | formatDate('YYYY-MM-DD HH:mm:ss') }}
案例代码
  1. 全局过滤器:格式化日期

    javascript 复制代码
    // 假设使用 day.js (需先引入)
    Vue.filter('formatDate', function (timestamp, format = 'YYYY-MM-DD') {
      if (!timestamp) return '';
      return dayjs(timestamp).format(format);
    });
    html 复制代码
    <p>发布时间:{{ article.publishTime | formatDate }}</p>
    <p>精确时间:{{ article.publishTime | formatDate('YYYY-MM-DD HH:mm:ss') }}</p>
  2. 局部过滤器:格式化金额

    javascript 复制代码
    new Vue({
      el: '#app',
      data: {
        productPrice: 1234567.89
      },
      filters: {
        formatCurrency: function (value, symbol = '¥') {
          if (typeof value !== 'number') return value;
          // 添加千分位分隔符
          const parts = value.toFixed(2).split('.');
          parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
          return symbol + parts.join('.');
        }
      }
    })
    html 复制代码
    <p>价格:{{ productPrice | formatCurrency }}</p> <!-- 输出:¥1,234,567.89 -->
    <p>价格:{{ productPrice | formatCurrency('$') }}</p> <!-- 输出:$1,234,567.89 -->
  3. 过滤器传参 上面的例子 (formatDateformatCurrency) 已经展示了如何传递参数 (formatsymbol) 来自定义格式化行为。

总结要点
  1. 掌握定义方式
    • 全局过滤器Vue.filter('name', function(value, ...args) { ... })
    • 局部过滤器 :在组件/实例的 filters: { name: function(value, ...args) { ... } } 中定义。
  2. 理解适用场景
    • 主要用于纯文本格式化(日期、货币、大小写转换、复数形式、单位换算等)。
    • 适用于需要在模板中简洁展示处理结果的情况。
  3. 提升代码质量
    • 可读性:模板中的过滤器调用清晰表达了数据转换的意图。
    • 复用性:相同的格式化逻辑只需定义一次过滤器,即可在多个地方使用。
    • 维护性:格式化逻辑集中在过滤器函数中,修改方便。

重要提示: Vue 2 广泛使用过滤器。在 Vue 3 中,官方移除了过滤器语法(|),建议使用计算属性 (computed)方法 (methods) 来实现类似的功能,或者使用全局属性/方法 (app.config.globalProperties) 来模拟全局过滤器。因此,在学习 Vue 3 时,请特别注意这个变化。

相关推荐
B站_计算机毕业设计之家几秒前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法
WeiXiao_Hyy33 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
吃杠碰小鸡1 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone1 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09011 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农1 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king2 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
辰风沐阳2 小时前
JavaScript 的宏任务和微任务
javascript
跳动的梦想家h3 小时前
环境配置 + AI 提效双管齐下
java·vue.js·spring
夏幻灵3 小时前
HTML5里最常用的十大标签
前端·html·html5