写文章不容易,点个赞呗兄弟 专一 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工做原理,源码版助于了解内部详情,让咱们一块儿学习吧 研究基于 Vue版本 【2.5.17】ide
若是你以为排版难看,请点击 下面连接 或者 拉到 下面关注公众号也能够吧函数
嗨,又到周末啦,又能够睡懒觉了,冬天睡懒觉真苏胡,可是我明天要无名加班this
好吧,今天咱们 解读 filter 的工做原理(话题转得真是生硬),filter 其实实现也是很是简单的,因此这里直接出源码版了 十分钟就能大概了解这个 filter 了吧 好吧,今天的研究,咱们仍然要带着问题去学习prototype
一、页面的 filter 解析成什么 二、设置的 filter 如何被调用code
<br> <br>blog
下面的讲解会如下面例子 做为讲解模板token
这里有一个过滤器 all,用来过滤 parentName作用域
<div>{{parentName|all }}</div>
new Vue({ el:document.getElementsByTagName("div")[0], data(){ return { parentName:111 } }, filters:{ all(){ return "我是过滤器" } } })
<br> <br>get
首先,上面的例子会被解析成下面的渲染函数
(function() { with(this) { return _c('div',[ _v(_s(_f("all")(parentName))) ]) } }
这段代码继续解释下
一、_c 是渲染组件的函数,这里会渲染出根组件
二、这是匿名自执行函数,后面渲染的时候调用,会 绑定当前实例为做用域
三、with 的做用是,绑定大括号内代码的 变量访问做用域,因此里面的全部变量都会从 实例上获取
而后,你能够看到 ' parentName | all ' 被解析成 _f('all')( parentName )
怎么解析的?
简单说就是,当匹配到 | 这个符号,就知道你用过滤器,而后就解析成 _f 去获取对应过滤器 并调用,这个过程不赘述
_f 是什么?
_f 是获取具体过滤器的函数
一、_f 会在Vue 初始化的时候,注册到 Vue 的原型上
// 已简化 function installRenderHelpers(target) { target._s = toString; target._f = resolveFilter; } installRenderHelpers(Vue.prototype);
所在在 上面的 渲染函数 with 绑定当前实例vm为做用域 以后,_f 从vm 获取,成了这样 vm._f
二、_f 是 resolveFilter,一个能够获取 具体filter 的函数
使用 _f("all") 就能获取到 all 这个过滤器,resolveFilter 下面会说
怎么获取下面继续.......
由上面能够看到,_f 是 resolveFilter 赋值的,下面是 resolveFilter 源码
// 已简化 function resolveFilter(id) { return resolveAsset( this.$options, 'filters', id, true ) || identity }
this.options 会拿到当前组件的全部选项
你问我为何?
根据上一个问题知道
一、_f 会使用 实例去调用 ,vm._f 类等 vm.resolveFilter
二、因此,resolveFilter 的 执行上下文 this 是 vm
三、因此,this.$options 就是 实例的 options 啦
接着,调用 resolveAsset ,目的就是拿到 组件选项中的 具体 filter
传入 当前组件的选项 ,指定要其选项 filters ,指定具体 filter 名
function resolveAsset( options, type, id, warnMissing ) { // g:拿到 filters 选项 var assets = options[type]; // g:返回 调用的 filter return assets[id] }
_f("all") 流程 就成了下面这样
一、拿到 组件选项 中的 filters
二、而后再从 filters 中,拿到 all 这个filter
三、执行返回的 all 过滤函数时,传入须要过滤的值 parentName
四、获得 返回了 过滤后的值
因此,当渲染函数解析的时候,碰到使用过滤器的地方,按流程拿到过滤值后,就能够渲染到页面上了
_f("all")(parentName)) 就会变成 "我是过滤器" 放到 渲染函数中,最后,就是渲染到页面了
<br> <br>
fitler 其实就是从组件选项 filters 获取你设置的某个filter,并调用,而后使用你函数执行的返回值渲染 太简单了,总结跟没总结同样.......