{{ 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过滤器的结果就是filterB过滤器的输入
。
过滤器参数接收
{{ message | filterA | filterB(“param”) }}
以上的过滤器的编译结果就是:
_s(_f("filterB")(_f("filterA")(message),"param"))
这里有一点注意的是:这个param参数是filterB的第二个参数,它的第一个参数是经过filterA处理的结果。
_f函数的原理
_f函数其实就是寻找过滤器的,如果找到过滤器就返回过滤器,找不到就返回与参数相同的值。它的代码其实很简单:
import {identity, 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 面试题
1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
[外链图片转存中…(img-1bvDVJ0e-1714177998838)]