这个插件是vuelidate
研究了它大半天,完全基于es6的写法,写的很酷炫,对于部分核心函数代码,没看懂。。
就如下面的例子
const buildFromKeys = (keys, fn, keyFn) => keys.reduce((build, key) => {
build[keyFn ? keyFn(key) : key] = fn(key)
return build
}, {})
const computedRules = buildFromKeys(validationKeys, (key) => {
const rule = validations[key]
return mapValidator(rootVm, rule, key, parentVm, parentProp)
}, mapDynamicKeyName)
const validationVm = new Vue({
data: {
dirty: false,
dynamicKeys
},
methods: defaultMethods,
computed: {
...computedRules,
...defaultComputed
}
})
就单纯考虑 computed中的...computedRules来看,我也看过了 es6中关于...拓展运算符的用法,还是没搞懂,为什么它这里可以成功运行呢。
假如有人 研究过这个 开源插件 就更好啦,希望可以和你多请教点问题, 谢谢~
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
...这三个点叫做 spread operator.语法是
通常大部分情况下
...是用来 copy 一个 array 或者方便地传入一个函数的参数注意 spread operator 只能作用在 iterableObj 上面, 而只有实现 iteration protocols 的元素才是被叫做 iterableObj
常见的iterableObj 有 String, Array, TypedArray, Map and Set, 很显然,我们的普通的 object 并没有 iterator 这个 property, 不信你看
但是 LZ 给出的代码里面
computedRules很明显是一个 object 啊, 为什么也可以用...???这是因为虽然es6里面没有这个用法, 但是大家已经寂寞难忍,饥渴难耐了,配合这个插件Object rest spread transform
就可以做到
但是我们为什么要这么做呢? 直接
不好吗?
不好!
为了避免 mutation 啊, 因为object 是 reference 传递的, 谁能保证你将来不会乱改
computed里面的 property 然后 不知情的情况下改了computedRules里面相应的 property.为了 immutability, 为了部落,!
当然你懒的装插件 或者就是看不惯这种用法, 也可以
这么写 行不行?
行
那么为什么不这么写
简单来说是代码相对复杂一点, 往深入了说就是 逼格不高 XD