| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> Vue源码阅读(33):过滤器的源码解析 -> 正文阅读 |
|
[JavaScript知识库]Vue源码阅读(33):过滤器的源码解析 |
今天和大家说说过滤器的实现原理,主要看过滤器模板字符串的编译和过滤器模板字符串编译出来的代码字符串。 我们以下面的代码为例:
在例子中, 注册了三个全局过滤器,分别是:capitalize、prefix、suffix。
页面的运行效果如下所示: 1,过滤器运行原理这一小节主要看过滤器模板字符串所编译出来的代码字符串,看看在运行时,过滤器是如何实现功能的。 1-1,没有传递参数的单个过滤器以第一个 h3 节点为例,模板字符串是
最终被编译成的 render 代码字符串是
这里可以发现 {{message | capitalize}} 被翻译成了 _f("capitalize")(message),这里的 _f 是 resolveFilter 方法的别名,他的作用是根据过滤器的名称获取对应的过滤器函数。所以这里的?_f("capitalize")(message) 可以看成?capitalize(message),也就是以 message 作为参数执行?capitalize 函数,并将过滤器函数执行的返回值作为?_s 函数的参数,最终的效果就是创建出来的 h3 vnode 节点的子节点是一个文本 vnode 节点,并且该文本 vnode 节点的 text 属性是 "Hello vue",可以发现 "Hello vue" 正是 "hello vue" 经过?capitalize 过滤器函数处理后的结果,这也就实现了过滤器想要的效果。 1-2,传递参数的过滤器以第二个 h3 节点为例,模板字符串是
最终被编译成的 render 代码字符串是
可以发现,这里所编译出的代码字符串和 1-1 小节差不多,唯一的不同是过滤器使用了参数,并且在编译出的代码字符串中,这个使用的参数作为 suffix 过滤器函数的第二个参数,message 作为 suffix 过滤器函数的第一个参数,关于这一点,官方文档也有专门的说明,如下图所示。 1-3,多个过滤器串联以第三个 h3 节点为例,模板字符串是
最终被编译成的 render 代码字符串是
通过观察可以发现,多个过滤器串联的实现原理是编译出嵌套的过滤器函数。在模板字符串中,message 变量首先经过?capitalize 过滤器处理,然后再经过?prefix 过滤器处理,因此在编译出的代码字符串中,首先以 message 作为参数执行?capitalize 过滤器函数,然后以?capitalize 过滤器函数的执行结果作为参数执行?prefix 过滤器函数,最后将?prefix 过滤器函数执行的结果作为 _s 方法的参数。 1-4,_f、resolveFilter 方法的运行原理在上面三小节中,_f 函数非常的重要,它的作用是根据过滤器的名称获取对应的过滤器函数,_f 是?resolveFilter 方法的别名,定义如下:
所以我们主要看?resolveFilter 方法的实现,代码如下:
resolveFilter 方法的内部借助?resolveAsset 方法实现功能,并且传递的参数有 this.$options、'filters'、过滤器名称,这个 this.$options 变量的作用是存储当前 Vue 实例能够使用的资源,包括指令、过滤器和组件,关于这部分知识可以看我的这篇文章。接下来看?resolveAsset 方法的实现。 resolveAsset 方法很简单,只要从 this.$options 变量中获取指定的资源,并返回出去即可,源码如下所示,看注释即可。
2,过滤器模板字符串的编译这一小节研究过滤器模板字符串是如何编译成对应的代码字符串的。 对应的源码在?src/compiler/parser/filter-parser.js 文件中,因为在真实的源码中有很多代码是处理边界情况的,不便于理解,所以我进行了主要代码的精简,方法大家理解主体逻辑,源码如下所示: 主线逻辑就是遍历?filters 字符串数组,调用?wrapFilter 方法完成代码字符串的拼接。
|
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 18:53:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |