【三十天精通Vue 3】第十二天 Vue 3 过滤器详解(已废弃)

news2024/10/6 16:25:51

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 Vue 3

文章目录

  • 引言
    • 一、Vue 3 过滤器概述
      • 1.1 过滤器的简介
      • 1.2 过滤器的作用
      • 1.3 过滤器的语法
    • 二、Vue 3 内置过滤器
      • 2.1 内置过滤器的简介
      • 2.2 内置过滤器的语法
      • 2.3 内置过滤器的使用
      • 2.4 内置过滤器示例
    • 三、Vue 3 自定义过滤器
      • 3.2 自定义过滤器的语法
      • 3.3 自定义过滤器的使用
      • 3.4 自定义过滤器示例
    • 四、Vue 3 过滤器链
      • 4.1 过滤器链的简介
      • 4.2 过滤器链的语法
      • 4.3 过滤器链的使用
      • 4.4 过滤器链示例
    • 五、Vue 3 过滤器的局限性
      • 5.1 过滤器的局限性
      • 5.2 解决过滤器局限性的方案
      • 5.3 实例演示
    • 六、Vue 3 过滤器的常见问题及解决方案
      • 6.1 过滤器使用问题
        • 6.1.1 过滤器的命名规则
        • 6.1.2 过滤器的作用域
      • 6.2 过滤器性能问题
      • 6.3 过滤器与计算属性的比较

引言

在 Vue 3 中,过滤器是一种对数据进行格式化的工具,用于在模板中过滤数据。今天将会介绍 Vue 3 中的过滤器相关知识,包括内置过滤器、自定义过滤器、过滤器链、过滤器的局限性以及解决方案等。

一、Vue 3 过滤器概述

1.1 过滤器的简介

过滤器是 Vue 提供的一种格式化数据的工具。它可以用于在模板中格式化数据并进行过滤。过滤器可以在模板表达式中通过管道符 | 调用,并可以接受参数。

1.2 过滤器的作用

过滤器主要用于格式化数据,如将数据转换为特定的格式,比如时间戳转换为日期、金额格式化等。

1.3 过滤器的语法

在模板表达式中使用过滤器的语法如下:

{{ data | filter1 | filter2 | ... }}

其中,data 为要进行过滤的数据,filter1filter2 等为过滤器名称,多个过滤器可以串联使用,每个过滤器可以接收参数。

二、Vue 3 内置过滤器

2.1 内置过滤器的简介

Vue 3 提供了一些常用的内置过滤器,如 capitalizeuppercaselowercasecurrency 等。这些过滤器可以直接在模板中使用,无需额外引入。

2.2 内置过滤器的语法

内置过滤器的语法如下:

{{ data | filterName(arg1, arg2, ...) }}

其中,filterName 为过滤器名称,arg1arg2 等为过滤器参数。

2.3 内置过滤器的使用

我们来看一个简单的例子,使用 capitalize 过滤器将字符串的首字母大写:

<template>
  <div>{{ message | capitalize }}</div>
</template>

<script>
import { defineComponent } from 'vue';

export default defineComponent({
  data() {
    return {
      message: 'hello world',
    };
  },
});
</script>

在上面的例子中,我们将 message 变量通过 capitalize 过滤器处理,使得输出的字符串首字母大写。

2.4 内置过滤器示例

Vue 3 提供了以下内置过滤器:

  • capitalize:将字符串的首字母大写。
  • uppercase:将字符串全部转为大写字母。
  • lowercase:将字符串全部转为小写字母。
  • currency:将数字格式化为货币格式。

以下是一个使用内置过滤器的示例:

<div id="app">
  <p>{{ message }}</p>
  <p>{{ message | capitalize }}</p>
  <p>{{ message | uppercase }}</p>
  <p>{{ message | lowercase }}</p>
  <p>{{ price | currency }}</p>
</div>
const app = Vue.createApp({
  data() {
    return {
      message: 'hello world',
      price: 1234.5678,
    }
  },
  filters: {
    capitalize(value) {
      if (!value) return ''
      value = value.toString()
      return value.charAt(0).toUpperCase() + value.slice(1)
    },
    uppercase(value) {
      if (!value) return ''
      return value.toUpperCase()
    },
    lowercase(value) {
      if (!value) return ''
      return value.toLowerCase()
    },
    currency(value) {
      if (typeof value !== 'number') return value
      const formatter = new Intl.NumberFormat('en-US', {
        style: 'currency',
        currency: 'USD',
      })
      return formatter.format(value)
    },
  },
})

app.mount('#app')

在这个示例中,我们在 Vue 实例中定义了一个 message 属性和一个 price 属性,它们分别代表一个字符串和一个数字。我们在模板中使用了四个内置过滤器:capitalize、uppercase、lowercase 和 currency。通过这些内置过滤器,我们可以方便地对数据进行处理和格式化,使其更符合我们的需求。

同时,我们还定义了一个自定义过滤器 capitalize,它能够将字符串的首字母大写。我们可以通过在 Vue 实例中定义 filters 属性来添加自定义过滤器,它是一个对象,其中的属性名就是过滤器的名称,属性值是过滤器函数。过滤器函数接收一个参数,即被过滤的值,返回经过处理后的新值。

在 currency 过滤器中,我们使用了 Intl.NumberFormat 类来将数字格式化为货币格式,它是一个 JavaScript 内置的国际化 API,能够根据不同的地区和语言,将数字格式化为对应的货币格式。

三、Vue 3 自定义过滤器

除了使用内置过滤器之外,Vue 3 还允许我们自定义过滤器,以满足一些特定的需求。自定义过滤器是一种可复用的函数,它可以在模板表达式中使用,以对数据进行处理和格式化。

3.2 自定义过滤器的语法

Vue 3 中自定义过滤器的语法和 Vue 2 中基本相同,使用 Vue.filter 方法定义一个过滤器:

Vue.filter('filterName', function(value) {
  // 过滤器的处理逻辑
  return processedValue
})

其中,filterName 是过滤器的名称,value 是需要进行处理的数据。过滤器函数可以返回一个经过处理后的新值,该值将在模板表达式中被渲染。

3.3 自定义过滤器的使用

自定义过滤器可以像内置过滤器一样在模板表达式中使用,语法为 {{ expression | filterName }}。在模板表达式中,表达式的值会作为过滤器函数的第一个参数传入,可以使用多个过滤器,它们会被串联在一起,每个过滤器的输出作为下一个过滤器的输入。

3.4 自定义过滤器示例

下面是一个自定义过滤器的示例,用于将字符串中的数字替换为相应的中文数字:

Vue.filter('chineseNumber', function(value) {
  const chineseNums = ['零','一','二','三','四','五','六','七','八','九']
  return String(value).replace(/\d/g, char => chineseNums[char])
})

我们可以在模板表达式中使用该过滤器:

<p>{{ 123456 | chineseNumber }}</p>

运行结果将会是:

<p>一二三四五六</p>

这个过滤器将数字 123456 转换为了中文数字。

四、Vue 3 过滤器链

4.1 过滤器链的简介

Vue 3 允许我们使用管道符号(|)将多个过滤器链接在一起,从而形成一个过滤器链。过滤器链的执行顺序是从左到右。

4.2 过滤器链的语法

使用管道符号(|)将多个过滤器链接在一起,例如:

{{ message | filterA | filterB }}

在这个例子中,message 是数据,filterAfilterB 是两个过滤器,它们会依次作用于 message 上。

4.3 过滤器链的使用

下面的例子演示了如何将内置过滤器和自定义过滤器链接在一起使用:

<template>
  <div>
    <p>原始数据:{{ message }}</p>
    <p>过滤器链1:{{ message | capitalize | reverse }}</p>
    <p>过滤器链2:{{ message | capitalize | reverse | toUpperCase }}</p>
  </div>
</template>

<script>
  import { defineComponent } from 'vue'

  const reverse = value => {
    return value.split('').reverse().join('')
  }

  export default defineComponent({
    data() {
      return {
        message: 'hello world'
      }
    },
    filters: {
      capitalize(value) {
        if (!value) return ''
        value = value.toString()
        return value.charAt(0).toUpperCase() + value.slice(1)
      }
    },
    methods: {
      toUpperCase(value) {
        return value.toUpperCase()
      }
    }
  })
</script>

在这个例子中,我们定义了一个 reverse 过滤器,它会将字符串翻转。然后,我们在模板中使用了两个过滤器链:

  1. {{ message | capitalize | reverse }}:先使用 capitalize 过滤器将字符串首字母大写,再使用 reverse 过滤器将字符串翻转。
  2. {{ message | capitalize | reverse | toUpperCase }}:先使用 capitalize 过滤器将字符串首字母大写,再使用 reverse 过滤器将字符串翻转,最后使用 toUpperCase 方法将字符串全部转为大写字母。

4.4 过滤器链示例

以下是一个使用过滤器链的示例,它会将数组中的数字转换成货币格式并进行求和:

<template>
  <div>
    <p>原始数据:{{ numbers }}</p>
    <p>过滤器链:{{ numbers | currency | sum }}</p>
  </div>
</template>

<script>
  import { defineComponent } from 'vue'

  export default defineComponent({
    data() {
      return {
        numbers: [10, 20, 30, 40, 50]
      }
    },
    filters: {
      currency(value) {
        return value.toLocaleString('en-US', { style: 'currency', currency: 'USD' })
      }
    },
    methods: {
      sum(values) {
        return values.reduce((prev, current) => prev + current, 0)
      }
    }
  })
</script>

在上面的示例中,我们定义了一个包含五个数字的数组,并使用了两个自定义过滤器:currency 和 sum。currency 过滤器将数字转换为货币格式,而 sum 过滤器计算数组中所有数字的总和。在模板中,我们使用过滤器链将这两个过滤器组合在一起,首先将数字转换为货币格式,然后计算它们的总和,并将结果显示在页面上。

注意,过滤器链的顺序非常重要。在上面的示例中,我们先使用了 currency 过滤器,然后才使用了 sum 过滤器,如果交换它们的顺序,将会导致程序运行出错。因此,在编写过滤器链时,请确保它们按照正确的顺序进行组合。

五、Vue 3 过滤器的局限性

5.1 过滤器的局限性

虽然 Vue 3 的过滤器功能非常强大和灵活,但也有一些局限性,包括:

  • 过滤器只能用于数据绑定和模板表达式中,不能用于计算属性、监听器等其他地方。
  • 过滤器不能传递参数,只能接受一个值作为参数,这使得一些复杂的数据处理变得困难。
  • 过滤器对于一些复杂的逻辑处理来说比较困难,此时应该使用计算属性或者方法来解决问题。

5.2 解决过滤器局限性的方案

为了解决过滤器的局限性,我们可以使用以下方案:

  1. 使用计算属性:计算属性与过滤器类似,但计算属性能够接受参数,并且能够处理更复杂的逻辑。例如,我们可以使用计算属性来实现货币格式化的功能。
  2. 使用方法:方法可以像过滤器一样被调用,但它能够接受参数,并且能够处理更复杂的逻辑。如果需要处理复杂的数据逻辑,我们可以使用方法来代替过滤器。
  3. 使用插件:如果我们需要处理的数据逻辑非常复杂,那么我们可以考虑使用插件来解决问题。插件可以为 Vue 应用程序提供自定义功能,包括全局过滤器、指令、组件等等。

5.3 实例演示

下面是一个使用计算属性代替过滤器的示例。它会将数组中的数字转换成货币格式并进行求和。

<template>
  <div>
    <p>原始数据:{{ numbers }}</p>
    <p>计算属性:{{ formattedNumbers }}</p>
    <p>计算属性求和:{{ sum }}</p>
  </div>
</template>
<script>
  import { defineComponent } from 'vue'

  export default defineComponent({
    data() {
      return {
        numbers: [10, 20, 30, 40, 50]
      }
    },
    computed: {
      formattedNumbers() {
        return this.numbers.map(number => {
          return number.toLocaleString('en-US', { style: 'currency', currency: 'USD' })
        })
      },
      sum() {
        return this.numbers.reduce((prev, curr) => prev + curr, 0)
      }
    }
  })
</script>

在这个示例中,我们使用了 formattedNumbers 计算属性来将数组中的数字转换为货币格式,然后使用 sum 计算属性来对数组中的数字进行求和。这两个计算属性可以取代使用过滤器的方式来实现相同的功能,而且还能够接受参数并处理更复杂的逻辑。

六、Vue 3 过滤器的常见问题及解决方案

6.1 过滤器使用问题

6.1.1 过滤器的命名规则

在 Vue 3 中,过滤器的命名必须遵循 JavaScript 的命名规则,即由字母、数字、下划线和美元符号组成,并且不能以数字开头。另外,过滤器名称不能与已有的 Vue 实例方法或全局方法重名。

6.1.2 过滤器的作用域

在 Vue 3 中,过滤器只能在当前组件的模板中使用,无法在子组件或父组件中使用。如果想在多个组件中共享过滤器,需要使用 mixin 或全局混入的方式。

6.2 过滤器性能问题

过滤器可以有效地实现数据的格式化,但是过多的过滤器使用会影响组件的性能。因为每个过滤器都会被调用一次,如果使用了多个过滤器,就会导致大量的函数调用和数据计算,进而影响应用程序的性能。

为了解决这个问题,可以考虑使用计算属性来替代过滤器。计算属性可以在组件渲染之前计算好数据,并将结果缓存起来,因此不会像过滤器那样每次都进行计算。同时,计算属性的使用也更加灵活,可以直接在组件中访问计算属性的值,而不必使用管道运算符。

6.3 过滤器与计算属性的比较

虽然过滤器和计算属性都可以实现数据的格式化,但是它们之间还存在一些差异:

  1. 过滤器可以链式调用,而计算属性不可以。
  2. 过滤器只能在模板中使用,而计算属性可以在组件中直接访问。
  3. 过滤器适合对单个数据进行格式化,而计算属性适合对多个数据进行计算和格式化。
  4. 过滤器对性能的影响较大,而计算属性对性能的影响较小。

因此,在实际开发中,需要根据具体的需求选择合适的方式进行数据的格式化。如果需要对单个数据进行简单的格式化,可以使用过滤器;如果需要对多个数据进行复杂的计算和格式化,可以使用计算属性。

在这里插入图片描述

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

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

相关文章

创建Vue3.0工程

1.使用 vue-cli 创建 官方文档&#xff1a;创建一个项目 | Vue CLI (vuejs.org) ## 查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的vue/cli npm install -g vue/cli ## 创建 vue create vue_test ## 启动 cd vue_test npm run se…

7年时间,从功能测试到测试开发月薪30K,有志者事竟成

突破自己的技术瓶颈并不是一蹴而就&#xff0c;还是需要看清楚一些东西&#xff0c;这里也有一些经验和见解跟大家分享一下。同样是职场人士&#xff0c;我也有我的经历和故事。在工作期间&#xff0c;我有过2年加薪5次的小小“战绩”&#xff08;同期进入公司的员工&#xff0…

番外12:ADS导出到AD变为PCB文件

番外12&#xff1a;ADS导出到AD变为PCB文件并嘉立创制板 番外12&#xff1a;ADS导出到AD变为PCB文件&#xff0c;此处的示例为功率放大器&#xff01; STEP 1: 从ADS导出dxf文件 打开制作好的版图文件&#xff0c;在原有基础上打好散热孔和固定孔&#xff0c;散热孔半径0.63…

PCB阻焊桥存在的DFM(可制造性)问题,华秋一文告诉你

PCB表面的一层漆&#xff0c;称为阻焊油墨&#xff0c;也就是PCB线路板阻焊油墨。阻焊油墨是PCB线路板中非常常见、也是主要使用的油墨&#xff0c;一般90%都是绿色&#xff0c;但也有杂色油墨&#xff1a;红色、蓝色、黑色、白色、黄色等。 阻焊油墨的作用就是绝缘&#xff0…

反射:替对象执行方法

反射&#xff0c;可不只是利用Class创建对象哟&#xff0c;更重要是替对象执行方法&#xff01;关于反射创建对象&#xff0c;它可以提供一种通用的机制&#xff0c;对任意Class对象得到它的实例&#xff0c;而不需要import。 举个例子&#xff0c;Spring底层就是利用反射为我…

各种文字生成图片的AIGC模型(openAI、谷歌、stable、Midjourney等)

1 前言 AIGC&#xff0c;全名“AI generated content”&#xff0c;又称生成式AI&#xff0c;意为人工智能生成内容。例如AI文本续写&#xff0c;文字转图像的AI图、视频等。 本文主要描述文字生成图片的模型。而且目前扩散模型&#xff08;Diffusion Models&#xff09;流行…

CANoe使用记录(一):新建Canoe工程

目录 1、概述 2、新建工程 2.1、新建工程界面 2.2、查看License 2.3、添加DBC文件 2.4、测量窗口 2.5、通道用量 2.6、通道匹配 2.7、硬件通道配置 2.8、状态监控 1、概述 Canoe是德国Vector公司推出的一款总线开发设备&#xff0c;主要用于总线类的开发、仿真、测试…

【Python】【进阶篇】二十六、Python爬虫的Scrapy爬虫框架

目录 二十六、Python爬虫的Scrapy爬虫框架26.1 Scrapy下载安装26.2 创建Scrapy爬虫项目1) 创建第一个Scrapy爬虫项目 26.3 Scrapy爬虫工作流程26.4 settings配置文件 二十六、Python爬虫的Scrapy爬虫框架 Scrapy 是一个基于 Twisted 实现的异步处理爬虫框架&#xff0c;该框架…

【Java 数据结构】单链表经典面试题 (动图解析)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Redis问题

一、认识Redis 1. 什么是 Redis&#xff1f; Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。Redis 提供了多种数据类型来支持不同的业务场景&#…

vue-seamless-scroll无缝滚动组件使用方法详解+解决轮播空白缝隙问题(最后面)

下载安装 1.npm npm install vue-seamless-scroll --save 2.yarn yarn add vue-seamless-scroll 使用 1、全局注册 import Vue from vue import scroll from vue-seamless-scroll Vue.use(scroll) //或者 //Vue.use(scroll,{componentName: scroll-seamless}) 2、局部注册 im…

刘强东的“百亿补贴” 被指“雷”声大雨点小

京东集团2022年财报显示&#xff0c;2022年第四季度京东收入为2954亿元&#xff0c;同比增加7.1%&#xff0c;与2021年四季度23%的同比增速确有不小的差距。前三季度对应的同比增速分别为17.95%、5.44%和11.35%&#xff0c;与2021年相比均有回落。从财报中可以看出&#xff0c;…

什么是Selenium?使用Selenium进行自动化测试

什么是 Selenium&#xff1f; Selenium 是一种开源工具&#xff0c;用于在 Web 浏览器上执行自动化测试&#xff08;使用任何 Web 浏览器进行 Web 应用程序测试&#xff09;。   等等&#xff0c;先别激动&#xff0c;让我再次重申一下&#xff0c;Selenium 仅可以测试Web应用…

Unity VFX -- (2)玩一玩粒子系统

增加火花 复杂的VFX通常是由多个单独的粒子系统所组成。当它们组合到一起时&#xff0c;这些独立的个体会产生出更加有趣的效果。下面我们来为火焰增加火花效果。 1. 在Hierarchy中&#xff0c;展开Fire_ParticleSystem_Prefab物体&#xff0c;选择VFX_Sparks子物体。 2. 激活V…

java springboot工程引导类,简单认识程序入口

我们在创建springboot项目时 总会看到这么一个启动类 首先 我们要知道 我们的程序最后就成立一个spring容器 而你所有的类都是交给这个spring容器去管理的 做 springboot 程序 也会有这个spring容器 为了方便大家看 我们将启动类的代码改成这样 package com.example.thres…

HTTP和第三方模块

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版&#xff0c;配图更多&#xff0c;CSDN博文图片需要手动上传&#xff0c;因此文章配图较少&#xff0c;看不懂的可以去菜鸡博客参考一下配图&#xff01; 系列文章目录 前端系列文章——传送门 后端系列文章——传送…

zookeepr 简介

简介&#xff1a; zookeeper是为分布式应用提供协调服务的高性能组件。zookeeper通过简单的接口暴露了一些公共服务(命名、配置管理、同步和分组服务), 因此你不需要从头开始写这些服务。你可以现成得使用zookeeper来实现共识、组管理、领导者选举和存在协议。你可以根据自己的…

ConcurrentHashMap分段锁

1.分段锁的设计目的 ConcurrentHashMap 是支持高并发的线程安全的 HashMap。相较于 HashTable 使用 synchronized 方法来保证线程安全&#xff0c;ConcurrentHashMap 采用分段锁的方式&#xff0c;在线程竞争激烈的情况下 ConcurrentHashMap 的效率高很多。 ConcurrentHashMa…

考勤系统的最佳实践 - 静态活体检测 API 技术

引言 静态活体检测&#xff08;Static Liveness Detection&#xff09;API 是一种基于人脸识别技术&#xff0c;用于判断面部图像或视频是否为真实人脸的 API 接口。它基于图片中人像的破绽&#xff08;摩尔纹、成像畸形等&#xff09;&#xff0c;判断目标是否为活体&#xf…

abpvnext 创建数据时发布本地事件ILocalEventBus.PublishAsync ,创建的数据被阻塞的问题解决

一、问题背景描述&#xff1a; 我有一个需求&#xff0c;需要在字典服务里创建字典类型成功后执行ILocalEventBus.PublishAsync 发布一个事件&#xff0c;让主业务服务订阅这个事件&#xff0c;然后执行业务代码将字典类型同步给所有租户。 最开始我在字典服务员的applicatio…