Vue过滤器原理

  • Vue过滤器
    • 什么是Vue过滤器
    • 定义Vue过滤器
      • 组件的选项中定义本地的过滤器
      • 或者在创建 Vue 实例之前全局定义过滤器
      • 单个器原理
      • 串联过滤器
      • 过滤器参数接收
    • _f函数的原理
      • 过滤器解析原理
    • 总结: vue 过滤器原理

Vue过滤器

过滤器实质不改变原始数据,只是对数据进行加工处理后返回过滤后的数据再进行调用处理

我们看一下官方的定义:

Vue.is 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式(后者从 2.1.0+开始支持)。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示

什么是Vue过滤器

Vue过滤器是一种用于在模板中对数据进行处理和格式化的功能。

它可以用来实现一些常见的文本格式化操作,例如日期格式化、数字格式化、字符串截取等。通过使用过滤器,我们可以在模板中直接调用过滤器函数,并将数据作为参数传递给它,然后使用过滤器函数对数据进行处理,最后返回处理后的结果。

在Vue中,过滤器可以用在 插值表达式、指令和绑定 等地方。

过滤器可以通过 全局注册或局部注册 的方式进行定义。

全局注册的过滤器可以在任何组件的模板中使用,而局部注册的过滤器只能在当前组件的模板中使用。

下面是一个示例,展示了如何定义和使用一个Vue过滤器:

<template><div><p>{{ message | capitalize }}</p><p>{{ price | currency }}</p><p>{{ date | formatDate('YYYY-MM-DD') }}</p></div>
</template><script>
export default {data() {return {message: 'hello world',price: 100.5,date: new Date()};},filters: {capitalize(value) {if (!value) return '';value = value.toString();return value.charAt(0).toUpperCase() + value.slice(1);},currency(value) {if (!value) return '';return '$' + value.toFixed(2);},formatDate(value, format) {// 省略日期格式化的具体实现}}
};
</script>

在上面的示例中,我们定义了三个过滤器:

  • capitalize
  • currency
  • formatDate

capitalize过滤器将字符串的首字母大写,currency过滤器将数字格式化为货币形式,formatDate过滤器将日期格式化为指定的格式。

在模板中,我们使用|符号来调用过滤器,并将需要处理的数据作为参数传递给它们。

注意:过滤器只能用于单向数据绑定,也就是说,它们不会修改原始数据,而是返回一个新的处理后的值。

如果需要在双向绑定中对数据进行处理,应该使用计算属性或侦听器来实现。

更多详细内容,请微信搜索“前端爱好者戳我 查看

定义Vue过滤器

<!- - 在双花括号中 -->
{{ message | capitalize }}<!-- 在v-bind~-->
<div v-bind:id="rawId | formatId"></div>
组件的选项中定义本地的过滤器
filters: {capitalize: function (value) {if (!value) return ''value = value.toString()return value.charAt(0).toUppercase() + value.slice(1)}
}
或者在创建 Vue 实例之前全局定义过滤器
Vue.filter('capitalize', function (value) { if (!value) return ''value = value .toString()return value.charAt(0) .toUppercase() + value.slice(1)}
)
new Vue({// ...
}}

过滤器函数总接收表达式的值(之前的操作链的结果)作为第一个参数。

在上述例子中capitalize 过滤器函数将会收到 message 的值作为第一个参数。过滤器可以串联

{{message | filterA | filterB }}

在这个例子中,filterA 被定义为接收单个参数的过滤器函数,表达式 message 的值将作为参数传入到函数中。

然后继续调用同样被定义为接收单个参数的过滤器函数 filterB,将filterA 的结果传递到 filterB 中。

过滤器是 JavaScript 函数,因此可以接收参数

{{message filterA('arg1', arg2) }}

这里,filterA 被定义为接收三个参数的过滤器函数。其中 message 的值作为第一个参数,普通字符串’arg1 作为第二个参数,表达式 arg2 的值作为第三个参数。

单个器原理

{{ message | capitalize}}

上面的过滤器经过一顿操作之后就会变成 _s(_f("capitalize")(message))

  • f: 该函数其实就是resolveFilter的别名,作用是从_this.$options.filter 找到过滤器并返回
  • s: 该函数就是toString函数的别名,作用是拿到过滤之后的结果并传递给toString()函数,结果会保存到VNode中的text届性,返回结果直接渲染视图
串联过滤器

{{ message | filterA | filterB }}

上面的串联过滤器经过一顿操作之后就会变成 _s(_f("filterB")(_f("filterA")(message)))

这里的意思就是message作为第一个参数传进filterA当中,然后经过filterA的处理结果就传进filterB当中。 即filterA过滤器的结果就是fiterB过滤器的输入

过滤器参数接收

{{ message | filterA | fiterB(“param”) }}

以上的过滤器的编译结果就是 _s(_f("filterB")(_f("filterA")(message), "param") )

这里有一点注意的是:这个param参数是filterB的第二个参数,它的第一个参数是经过filterA处理的结果。

_f函数的原理

_f函数其实就是寻找过滤器的,如果找到过滤器就返回过滤器,找不到就返回与参数相同的值。

它的代码其实很简单

import {fidentity, resolveAssets} from 'core/util/index'export function resolveFilter(id){return resolveAssets(this.$options,'filters', id,true) || identity
}

我们重点来看一下resolveAssets到底做了什么事情。

export function resolveAsset (options, type, id,warnMissing){if(typeof(id) !== 'string'){return}const assets = options[type] 
if(hasOwn(assets,  id)) return assets[id]const camelizedId = camelize(id)
if(hasOwn(assets, camelizedId)) return assets[camelizedId]const PascalcaseId = capitlize(camelizedId)
if(hasOwn(assets, PascalcaseId)) return assets[PascalcaseId//检查原型链
const res assets[id] || assets[camelizedId] ||  PascalcaseId
if(process.enV.NODE_ENV!=='production'&& warnMissing && !res){warn('Fail to resolve' + type.slice(0,-1)+':'+id, options)
}
return res 

其实它的寻找过程也很简单,主要是做了以下的操作 (id是过滤器id):

  • 判断过滤器id是否为字符串,不是则终止
  • 用assets存储过滤器
  • hasOwn函数检查assets自身是否存在id届性,存在则返回
  • hasOwn函数检查assets自身是否存在 驼峰化后的 id属性,存在则返回
  • hasOwn函数检查assets自身是否存在将 首字母大写后的 id属性,存在则返回
  • 如果还是没有,就是去原型链找,找不到就会打印警告
过滤器解析原理

我们想一下,解析器是怎么解析过滤器的语法?

其实在vue内部专内有这么一个函数用来解析过滤器语法。parseFilters

它的原理就是解析过滤器列表,然后 循环过滤器列表 并 拼接字符串。

总结: vue 过滤器原理

Vue过滤器的原理主要是在编译阶段将过滤器编译成函数进行调用。

具体来说,Vue内部有一个专门用来解析过滤器语法的函数——parseFilters,它解析过滤器列表并循环过滤器列表,拼接字符串。过滤器实质不改变原始数据,只是对数据进行加工处理后返回过滤后的数据再进行调用处理。

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

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

相关文章

基于数字双输入的超宽带Doherty功率放大器设计-从理论到ADS版图

基于数字双输入的超宽带Doherty功率放大器设计-从理论到ADS版图 参考论文: 高效连续型射频功率放大器研究 假期就要倒计时啦&#xff0c;估计是寒假假期的最后一个博客&#xff0c;希望各位龙年工作顺利&#xff0c;学业有成。 全部工程下载&#xff1a;基于数字双输入的超宽…

遇到问题(二) 中文乱码

例如这样&#xff1a; 原本是这样&#xff1a; 解决方法&#xff1a;点击扳手工具设置——Editor——Encoding——选chinese GB2312&#xff08;有的是UTF-8&#xff09;

LabVIEW高速信号测量与存储

LabVIEW高速信号测量与存储 介绍了LabVIEW开发的高速信号测量与存储系统&#xff0c;解决实验研究中信号捕获的速度和准确性问题。通过高效的数据处理和存储解决方案&#xff0c;本系统为用户提供了一种快速、可靠的信号测量方法。 项目背景 在科学研究和工业应用中&#xf…

数学能够及不能够有效表征人类智能中的部分

一、数学能够有效表征人类智能中的以下部分&#xff1a; 1、部分逻辑推理能力&#xff1a;数学涉及到推理、证明和解决问题的过程&#xff0c;这需要运用逻辑思维和推理能力。通过学习数学&#xff0c;人们能够培养自己的部分逻辑思维和推理能力&#xff0c;从而提高某些问题解…

Ubuntu18.04有线连接后,无法设置ip地址以及显示网口设置

前提&#xff1a;首先测试过网线是完全没问题的 桌面端找不到设置网口 终端输入&#xff1a; ifconfig 没有找到网口设置和对应IP 然后查询网口驱动是否正常安装&#xff0c;输入&#xff1a; lspci | grep Ethernet 有输出说明网口驱动正常安装 然后查询电脑的ip地址&am…

物流EDI:Verizon EDI 需求分析

作为物流行业的企业&#xff0c;Verizon与其供应商之间通过EDI来传输业务单据。在与Verizon建立EDI连接时&#xff0c;需要参考EDI 指南、采购订单条款和条件以及运输路线指南这三个文档。 点击此链接&#xff0c;获取上述的三个文档 Verizon供应商可以通过上述链接找到用于处…

2024-2-19

编译安装php下载依赖包时遇到的报错 [rootmasternamed ~]# yum -y install php-mcrypt \ > libmcrypt \ > libmcrypt-devel \ > autoconf \ > freetype \ > gd \ > libmcrypt \ > libpng \ > libpng-devel \ > libjpeg \ > libxml2 \…

ubuntu22.04@laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module

ubuntu22.04laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 使用 OpenCV DNN 模块进行图像分类3.1 导入模块并加载类名文本文件3.2 从磁盘加载预训练 DenseNet121 模型3.3 读取图像并准备为模型输…

Python 实现Excel 文件合并

Excel 文件合并方法较多,前面文章有通过Uipath RPA 对文件进行合并,也可以通过Python或VBA写脚本合并。 通常写脚本维护性更加简洁,本文提供Python 脚本对Excel 文件进行合并,参考Uipath 调用Python 文章,Uipath 调用Python 脚本程序详解-CSDN博客 便能快速实现。代码如…

解决npm淘宝镜像到期问题

1 背景 由于node安装插件是从国外服务器下载&#xff0c;如果没有“特殊手法”&#xff0c;就可能会遇到下载速度慢、或其它异常问题。 所以如果npm的服务器在中国就好了&#xff0c;于是我们乐于分享的淘宝团队干了这事。你可以用此只读的淘宝服务代替官方版本&#xff0c;且…

ARM体系在linux中的中断抢占

上一篇说到系统调用等异常通过向量el1_sync做处理&#xff0c;中断通过向量el1_irq做处理&#xff0c;然后gic的工作都是为中断处理服务&#xff0c;在rtos中&#xff0c;我们一般都会有中断嵌套和优先级反转的概念&#xff0c;但是在linux中&#xff0c;中断是否会被其他中断抢…

kali入门

文章目录 第一部分&#xff1a;安装Kali Linux步骤一&#xff1a;下载Kali Linux镜像文件步骤二&#xff1a;安装VMware Workstation Pro步骤三&#xff1a;安装Kali Linux 第二部分&#xff1a;Kali Linux简介第三部分&#xff1a;关于作者第四部分&#xff1a;DDoS攻击实例代…

js_三种方法实现深拷贝

深拷贝&#xff08; 递归 &#xff09; 适用于需要完全独立于原始对象的场景&#xff0c;特别是当对象内部有引用类型时&#xff0c;为了避免修改拷贝后的对象影响到原始对象&#xff0c;就需要使用深拷贝。 // 原始对象 const obj { uname: Lily,age: 19,hobby: [乒乓球, 篮球…

力扣 188. 买卖股票的最佳时机 IV

题目来源&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/ C题解&#xff1a;动态规划 思路同力扣 123. 买卖股票的最佳时机 III-CSDN博客&#xff0c;只是把最高2次换成k次。如果思路不清晰&#xff0c;可以将k从0写到4等找找规律…

Vue | (三)使用Vue脚手架(上) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;初始化脚手架&#x1f407;创建初体验&#x1f407;分析脚手架结构&#x1f407;关于render&#x1f407;查看默认配置 &#x1f4da;ref与props&#x1f407;ref属性&#x1f407;props配置项 &#x1f4da;混入&#x1f4da;插件&#x1f4da;scoped样…

参数替换之${parameter-default}和${parameter:-default}

1.${parameter-default}和${parameter:-default} ${parameter-default}&#xff0c;如果变量parameter没被声明&#xff0c;那么就使用默认值 ${parameter:-default}&#xff0c;如果变量parameter没被声明&#xff0c;那么就使用默认值 ${parameter-default}和${parameter:-…

【Java】纯小白的三种工厂模式基础知识学习笔记

工厂模式概念 在Java中&#xff0c;工厂模式是一种设计模式&#xff0c;用于创建对象而无需指定明确的类。工厂模式通过定义一个共同的接口或抽象类来创建对象&#xff0c;然后由工厂类根据特定条件或参数来实例化具体的对象。 工厂模式通常包括三种类型&#xff1a;简单工厂…

Linux网络编程——序列反序列化

文章目录 0. 前言1. 认识协议2. 序列号与反序列化3. 自定义协议——网络计算器4. json 本章Gitee仓库&#xff1a;序列反序列化 0. 前言 tcp是面向字节流的&#xff0c;但是如何保证读取的数据是一个完整的报文呢&#xff1f; 管道也是面向字节流&#xff0c;写端写了一大堆的…

LeetCode_20_简单_有效的括号

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 栈 1. 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型…

Sora:新一代实时音视频通信框架

一、Sora简介 Sora是一个开源的实时音视频通信框架&#xff0c;旨在提供高效、稳定、可扩展的音视频通信解决方案。它基于WebRTC技术&#xff0c;支持跨平台、跨浏览器的实时音视频通信&#xff0c;并且具备低延迟、高并发、易集成等特点。 --点击进入Sora(一定要科学哦&#x…