我"崩"不住了,在彭凡同志锲而不舍的催促下这篇文章终于"蛋"生了。 说正经的这篇文章不好写,不好写的原因是我不太擅长写这些类比文,但它还是写出来了。 相信大部分人都有开发过功能插件,在写插件的时候普遍应用基本思想是以"默认配置为优先,以用户配置为覆盖"。如果你觉得简单先别着急穿裤子走人继续往下看看。

Validator插件

$

之前写过一个轻量级数据校验插件使用非常简单,你只需要找到form表单节点调用调用Validator 方法即可,就能在文本框中输入值进行自定校验。

$

当然也会给用户相对的自由度如"校验事件、错误提示信息 ..."你只需要按照规定来配置就好了。

*********************分割线**********************

在写Vue代码的小伙伴同样要写很多的选项:"el、data、props、template、render、mounted..." 那Vue在处理这些选项也是使用"非黑即白"的处理思想吗?明确的说没有 Vue 在处理选项有非常多限制如:

  • el 只在用 new 创建实例时生效。
  • data 组件的定义只接受function。
  • 直接在 DOM中使用组件时,组件名只有是 kebab-case 才有效。
  • 生命周期钩子...

也就是说在Vue 中"非黑即白"的思想并不适用,Vue需要针对特殊选项做不同的处理,有的选项处理逻辑是再此能不能用,有的选项处理逻辑是校验Value合法性,有的选项的逻辑是需要合并处理。.... 这种处理方式比较官方的说法叫"选项自定义策略处理"。

选项自定义策略处理

在讲选择自定义策略处理之前先说说vm.$option实例属性,它是用于当前 Vue 实例的初始化选项。需要在选项中包含自定义属性时会有用处:

var 

输出vm.$option:

{

有没有感觉奇怪在实例初始化选项中data的值是一个对象,为什么vm.$option中data的值变成一个函数了?开始揭秘...

Vue构造函数

function 

在创建Vue实例的时候你传递进来的自定义选项对象会传递给this._init这个方法。

Vue

vm.$options 属性定义在Vue.prototype._init 原型方法中。 vm.$options的值是调用mergeOptions函数的返回值。

mergeOptions

function 

先来看看调用mergeOptions的三个参数。

  • resolveConstructorOptions - 这个函数的作用是用来获取当前实例构造者的 options 属性(注:涉及到组件相关的内容暂时不解释,在此你可以默认他传递是一个纯对象)
  • options - 自定义选项对象
  • vm - Vue实例

mergeOptions 最终返回的是在函数内置的options纯对象。 options 所拥有的属性就是调用mergeField函数传递进来的key。

举个栗子:

你在创建Vue的根实例,并且传递了一个自定义选项对象。

var 

自定义选项对象会作为实参传递给mergeOptions函数的child形参。

for 

通过for..in.. 语句把child对象上可枚举的属性名作为参数传递给mergeField。

hasOwn是检测关于组件中父实例中是否key属性如果有将不会重复的调用mergeField,因为父子组件实例中相同的属性只需要做一次策略处理就可以了。(注:不扩展讲解)

当前栗子中"el"、"data"、"count" 这三个属性名作为字符串会作为参数传递给mergeField函数。那在mergeField函数中会给options 扩展 options.el = undefined 、 options.data = undefined 、 options.count = undefined 三个属性,为什么这三个属性的值都是undefined的呢?

原因是他们的value都需要通过调用 strat(parent[key], child[key], vm, key) 函数返回值来确定所以都暂定undefined,那strat 是什么?

var 

strats是自定义策略对象,strats[key]是检测在这个自定义策略对象上有没有[key]这个属性,如果有就表示针对[key]属性写了策略函数反之就没写。

defaultStrat 默认策略函数

var 

默认策略函数要弄懂它你只需要明白parentVal 、childVal 这两个参数。

  • parentVal 就是在调用strat 传递进来的parent[key],因为我们默认parent为纯函数所以parentVal 永远为undefined。
  • childVal 就是在调用strat 传递进来的childVal[key],也就是自定义选项对象中的[key]属性的值。

strats 自定义策略对象

var 

strats 是获取了config 全局配置对象上optionMergeStrategies属性的值。

var 

你是不是觉得奇怪为什么不直接通过字面量方式创建一个纯对象赋值给strats,而要通过Object.create(null)创建纯对象。这样不麻烦了吗? 问题暂时保留。往下看Vue中自定义的策略函数。

strats

可以看到Vue中对"el", "data","watch","props"等等....选项都写了策略函数。 在回归到mergeField函数你是否能顿悟了。

function 

如果某个选项写了策略函数那么就会调用这个策略函数,返回值会成为options[key] 的value。最后:mergeOptions 函数执行完毕返回options引用给到vm.$options。

现在来解释刚刚的那个问题。为什么不直接通过字面量方式创建一个纯对象赋值给strats,而要通过Object.create(null)创建纯对象?原因是Vue想给用户自定义选项自由度,也能添加策略函数。

举个栗子:

你在创建Vue的根实例,并且传递了一个自定义选项对象。

var vm = new Vue({el: "#app",data: {message: "hello Vue",},count: 9,
})

我想针对count写个添加策略函数怎么办。

Vue

这个策略函数很简单,监听childVal的值: 如果大于99返回本身,小于99 返回99。count策略函数返回值给到vm.$options.count。

那Vue.config是怎么访问到的呢?

function 

你细品这个代码。 看不懂留言请相信我一定会假装看不见。

vue中rules校验是验证首字符_小白也能秒懂Vue源码中那些精细设计(选项处理)...相关推荐

  1. android eclipse关联源码,在源码中编译自己的 Android project(eclipse编译的工程加到源码中)...

    1)将在Eclipse (当然也可以用记事本编写)中编写好的纯源代码(src+res+AndroidManifest.xml )拷到Android 源代码文件夹下的packages/apps 文件夹中 ...

  2. Linux内核源码中使用宏定义的若干技巧

    在C中,宏定义的概念虽然简单,但是真要用好却并不那么容易,下面从Linux源码中抽取一些宏定义的使用方法,希望能从中得到点启发: 1. 类型检查 比如module_init的宏定义: 点击(此处)折叠 ...

  3. vue源码中优秀代码片段(一)

    一.前言 笔者在读Vue源码时, 手记一些源码中优美的代码片段,一起来学习吧 二.代码片段 1. makeMap 检测某值是否在字符串(逗号分隔的字符串)中存在, 运用了柯里化函数和缓存函数 源码鉴赏 ...

  4. 什么是php的ast结构,什么是AST?Vue源码中AST语法树的解析

    这篇文章给大家介绍的内容是关于什么是AST?Vue源码中AST语法树的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是AST AST是指抽象语法树(abstract syn ...

  5. 基于Vue源码中e2e测试实践

    您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ 基于Vue源码中e2e测试实践 前言 技术选型&对Vue的参考 Puppeteer测试流程 在Concis中 ...

  6. Vue源码中的对象相等比较

    Vue源码中的对象比较函数写的极为经典漂亮,在此进行部分注释并添加一个函数类型比较判断,代码如下: function isObject(o) {return typeof o==='object'}f ...

  7. 「从源码中学习」面试官都不知道的Vue题目答案

    前言 当回答面试官问及的Vue问题,我们除了照本宣科的回答外,其实还可以根据少量的源码来秀一把,来体现出你对Vue的深度了解. 本文会陆续更新,此次涉及以下问题: "new Vue()做了什 ...

  8. vue 拷贝 数组_vue源码中值得学习的方法

    最近在深入研究vue源码,把学习过程中,看到的一些好玩的的函数方法收集起来做分享,希望对大家对深入学习js有所帮助.如果大家都能一眼看懂这些函数,说明技术还是不错的哦. 1. 数据类型判断 Objec ...

  9. 从Vue.js源码中我学到的几个实用函数

    大家好,我是若川.欢迎加我微信 ruochuan12,长期交流学习.今天推荐Vuejs源码中几个实用的方法. 如果想看Vuejs源码,不知道如何下手,一般推荐配置Sourcemap,针对单个问题调试来 ...

最新文章

  1. php 实现tab切换_微信小程序实例:实现顶部tab切换以及滑动切换时导航栏会随着移动的效果(代码)...
  2. 2-Tenor AF AFT400-实战-Lync Server 2010-集成-2012-01-19
  3. python爬虫多线程是什么意思_python爬虫中多线程的使用详解
  4. 页面复杂对象传递参数 开发中遇到的问题
  5. Flask框架——路由和视图
  6. Linux设备驱动01:Linux设备驱动概述
  7. 20145120 《Java程序设计》实验一实验报告
  8. 锤子发布会2018的四个环节概述
  9. html5手指点击速度,CPS手速测试 - 鼠标点击速度测试插件
  10. 10款网站后台管理系统模板_bootstrap网站后台模板_html后台模板下载(五)
  11. Redis学习三:设计与实现之单机数据库的实现
  12. 微信小程序生成体验版二维码
  13. 【WPS】中插入“公式”后行距不正常的解决办法
  14. pdf怎么添加水印?
  15. 高中计算机必修选修知识点总结,高中数学必修+选修全部知识点精华归纳总结.pdf...
  16. c语言异形图片,“异形”二字描述了他的一生
  17. 最大熵阈值python_使用python进行普适计算
  18. Delphi数据库处理(感谢:neverdeath)
  19. matlab——识别图像中的圆形目标
  20. 华为5c_华为5c手机价格及产品参数配置【图文】

热门文章

  1. ubuntu 安装deb程序文件失败的解决方法
  2. 0.IT-解决方案-0-VOIP
  3. 程序员须知:必须建立个人知识库,它的重要性你需要了解一下!
  4. 程序员的搞笑日常,你们懂得!....
  5. linux命令中tar后跟的zxvf是什么意思
  6. 3种思路,快速打破制造业质量追溯困境,成为行业领先企业
  7. 在谈数据治理和数字化的时候,别忘了数据标准
  8. 5招训练你的数据敏感度,数据高手都在用
  9. 对于内向、不善于社交的人来说,如何建立人脉?
  10. 区分那些是属于构架方面的C++功能