【三十天精通Vue 3】第十二天 Vue 3 过滤器详解

news2024/10/7 8:27:19

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 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/443315.html

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

相关文章

WEB通用漏洞水平垂直越权详解业务逻辑访问控制脆弱验证

目录 一、知识点概述 <分类> <原理简述> 二、水平越权示例——检测数据比对弱 <越权演示> <如何防护> 三、垂直越权示例——权限操作无验证 <越权演示> <漏洞成因> 四、访问控制示例——代码未引用验证 <越权演示> 五、脆…

如何才能写出一个符合预期的正则?

如何才能写出一个符合预期的正则&#xff1f; 正则表达式入门示例讲解1、java里正则表达式replaceAll连续的字符正则测试题主问题讲解 2、开发者遇到金额的校验正则描述正则测试 3、java正则表达式匹配字符串正则描述正则测试 4、关于#正则表达式#的问题&#xff0c;如何解决&a…

0基础自学软件测试 用这个方法 99%的人都成功了

对于大多数0基础的小白而言&#xff0c;刚开始学软件测试&#xff0c;肯定会遇到各种各样的难题&#xff0c;有时候问题多了&#xff0c;扛不住了&#xff0c;导致最后无法坚持&#xff0c;或者学的很杂&#xff0c;学而不精。 那么有哪些比较有效的方法和技巧&#xff0c;可以…

系统分析师之数据库系统(七)

目录 一、数据库概念 1.1 数据库管理系统DBMS 1.2 数据库系统DBS 二、数据库设计 2.1 数据库设计过程 2.2 E-R模型 2.3 关系代数 2.4 规范化理论 2.4.1 价值与用途 2.4.2 函数依赖 2.4.3 键 2.4.4 范式 2.4.5 无损分解 三、并发控制 3.1 基本概念 3.2 问题示例…

SCA技术进阶系列(二):代码同源检测技术在供应链安全治理中的应用

一、直击痛点&#xff1a;为什么需要同源检测 随着“数字中国”建设的不断提速&#xff0c;企业在数字化转型的创新实践中不断加大对开源技术的应用&#xff0c;引入开源组件完成应用需求开发已经成为了大多数研发工程师开发软件代码的主要手段。随之而来的一个痛点问题是&…

开启数字化之旅:VR全景视频带你进入真实而神奇的世界

引言&#xff1a;随着科技的不断发展&#xff0c;虚拟现实技术正在成为越来越多人所追捧和体验的技术。而VR全景视频作为虚拟现实技术的一种重要应用&#xff0c;也得到了越来越多人的关注。那么&#xff0c;VR全景视频到底是什么&#xff1f;它的优势和特点是什么&#xff1f;…

OpenGL入门教程之 变化颜色的三角形

一、 知识点 &#xff08;1&#xff09;着色器 着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序&#xff0c;因为它们之间不能相互通…

153. 寻找旋转排序数组中的最小值

已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,2] 若旋转 7 次&#xff0…

【刷题】搜索——BFS:字串变换【双向广搜模板】

双向广搜是BFS的一种优化方式&#xff0c;就是起点和终点同时往中间搜索。 假设每搜一步&#xff0c;都会有6种新的状态进入队列&#xff0c;搜索10步才能得到答案&#xff0c;总状态数是 1 6 6 2 6 3 . . . 6 9 166^26^3...6^9 166263...69。 但是假如已知终点的状态&am…

Crash分析gpu非法访问地址问题

Crash分析gpu非法访问地址问题 1. 问题描述 在我司产品monkey老化过程中&#xff0c;极低概率出现gpu驱动访问非法地址导致kernel panic问题&#xff0c;在kernel panic后&#xff0c;主动触发ramdump机制&#xff0c;抓到相关的ramdump文件&#xff0c;利用crash工具进行离线…

ggrcs包2.9版本发布----增加了绘制单独rcs曲线(限制立方样条)的singlercs函数

目前本人写的ggrcs包新的2.8版本已经在CRAN上线&#xff0c;目前支持逻辑回归&#xff08;logistic回归&#xff09;、cox回归和多元线性回归。增加了绘制单独rcs曲线&#xff08;限制立方样条&#xff09;的singlercs函数。 需要的可以使用代码安装 install.packages("…

UE4/5多人游戏详解(五、创建多人游戏插件)

目录 创建插件&#xff1a; 功能制作&#xff1a; 基础构造&#xff1a; 代码&#xff1a; 准备&#xff1a; 代码&#xff1a; 之前4个内容&#xff0c;我简单的讲解了一个项目中如何加入多人会话。 现在我们做一个插件&#xff0c;这样就不需要每一次创建项目的时候就…

CT前瞻(二):Vant4实战之Card卡片与Cell单元格

文章目录 &#x1f4cb;前言&#x1f3af;关于 Card卡片 和 Cell单元格 组件&#x1f9e9;Cell单元格&#x1f9e9;Card卡片 &#x1f3af;实战代码&#x1f4dd;最后 &#x1f4cb;前言 最近在项目开发和学习的过程中&#xff0c;涉及到了Vant UI&#xff08;简称Vant&#x…

气传导耳机和骨传导耳机的区别是啥?气传导耳机有哪些优缺点?

本文主要讲解一下气传导耳机和骨传导耳机的区别、气传导耳机的优缺点&#xff0c;并推荐一些目前主流的气传导耳机款式&#xff0c;大家可以根据自身需求&#xff0c;选择自己感兴趣的部分观看。 气传导耳机和骨传导耳机不同点&#xff1a; 气传导耳机和骨传导耳机最大且最根…

HTML+CSS+JS 学习笔记(二)———CSS

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;前端 &#x1f331;往期回顾&#xff1a;HTMLCSSJS 学习笔记&#xff08;一&#xff09;———HTML(上) HTMLCSSJS 学习笔记&#xff08;一&#xff09;———HTML(中) HTMLCSSJS 学习笔记&#…

数字信号预处理——平滑和去噪

数字信号预处理 对信号进行去噪、平滑和去趋势处理&#xff0c;为进一步分析做好准备。从数据中去除噪声、离群值和乱真内容。增强信号以对其可视化并发现模式。更改信号的采样率&#xff0c;或者使不规则采样信号或带缺失数据信号的采样率趋于恒定。为仿真和算法测试生成脉冲…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20

目录 前言算法题&#xff08;LeetCode刷题59螺旋矩阵II&#xff09;—&#xff08;保姆级别讲解&#xff09;分析题目&#xff1a;算法思想&#xff08;重要&#xff09;螺旋矩阵II代码&#xff1a; 结束语 前言 本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删…

英码科技深元ai工作站在化工园区应用,保障安全生产

当今&#xff0c;随着工业化进程的不断推进&#xff0c;化工产业作为重要的基础产业之一&#xff0c;为社会经济发展做出了巨大贡献。然而&#xff0c;随着化工园区规模的不断扩大&#xff0c;化工园区内的安全问题和环境问题也日益突出。因此&#xff0c;如何通过科技手段提升…

网络安全文章汇总导航(持续更新)

网络安全文章汇总导航&#xff08;持续更新&#xff09; 1. 介绍1.1. 初衷1.2. 更新时段1.3.最近更新时间及内容 2. 文章列表2.1. 基础篇2.2. 工具篇2.3. 靶场安装篇2.4. 权限提升篇2.5. 漏洞复现篇2.6. 加固与排查篇2.7. APP渗透篇2.8. 其它基础篇 1. 介绍 本章主要将博客中的…

ROS学习第十二节——话题通信控制小乌龟

1.基操一下 首先打开小乌龟程序和键盘控制程序 rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key 查看话题列表 rostopic list 打开计算图查看具体是那个话题在起作用 rqt_graph 从上图可以看到两个节点之间的话题是 /turtle1/cmd_vel 使用以下命令获…