一、Vue.directive

Vue.directive(id,[definition]);

1)参数

{ string } id{ Function | Object }  [ definition ]

(2)用法

注册或获取全局指令。

Vue.directive('my-directive',{ bind:function(){}, inserted:function(){}, update:function(){}, componentUpdated:function(){}, unbind:function(){},})

Vue.directive('my-directive',function(){

})

var myDirective = Vue.directive('my-directive');

(3) 除了核心功能默认内置的指令外(v-model和v-show),Vue.js也允许注册自定义指令。虽然代码复用和抽象的主要形式是组件,但是有些情况下,仍然需要对普通DOM元素进行底层操作,这时就会用到自定义指令。

(4)Vue.directive方法的作用是注册或获取全局指令,而不是让指令生效。其区别是注册指令需要做的事是将指令保存在某个位置,而让指令生效是将指令从某个位置拿出来执行它。

(5)实现

Vue.options = Object.create(null);Vue.options['directives'] = Object.create(null);

Vue.directive = function(id,definition){ if(!definition){  return this.options['directive'][id]; }else{  if(typeof definition === 'function'){   definition = { bind: definition,update: definition};  }  this.optipns['directive'][id] = definition;  return definition; }}

1、在Vue构造函数上创建了options属性来存放选项,并在选项上新增了directive方法用于存在指令。

2、Vue.directive方法接受两个参数id和definition,它可以注册或获取指令,这取决于definition参数是否存在。

3、如果definition参数不存在,则使用id从this.options['directive']中读出指令并将它返回。

4、如果definition参数存在,则说明是注册操作,那么进而判断definition参数的类型是否是函数。

5、如果是函数,则默认监听bind和update两个事件,所以代码中将definition函数分别赋值给对象中的bind和update这两个方法,并使用这个对象覆盖definition。

6、如果definition不是函数,则说明它是用户自定义的指令对象,此时不需要做任何操作,直接将用户提供的指令对象保存在this.optipns['directive']上即可。

二、Vue.filter

Vue.filter(id,[definition]); (1)参数

{ string } id{ Function | Object }   [definition]

(2)用法

注册或获取全局过滤器

Vue.filter('my-filter',function(value){

})

var myFilter = Vue.filter('my-filter');

(3)Vue.js允许自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和v-bind表达式。过滤器应该被添加到Javascript表达式的尾部,由“管道”符号指示

{{ message | capitalize }}

<div v-bind:id="rawId | formatId ">div>

(4)Vue.filter的作用仅仅是注册或获取全局过滤器。

(5)实现

Vue.options['filters'] = Object.create(null);

Vue.filter = function(id,definition){ if(!definition){  return this.options['filters'][id]; }else{  this.optipns['filters'][id] = definition;  return definition; }}

1、在Vue.options中新增了filters属性用于存放过滤器,并在Vue.js上新增了filter方法,它接受两个参数id和definition。

2、Vue.filters方法可以注册或获取过滤器,这取决于definition参数是否存在。

3、如果definition不存在,则使用id从this.options['filters']中读出过滤器并将它返回。

4、如果definition存在,则说明是注册操作,直接将该参数保存到this.optipns['filters']中。

三、Vue.component

Vue.component(id,[definition]);

1)参数

{ string } id{ Function | Object } [definition]

(2)用法

注册或获取全局组件。注册组件时,还会自动使用给定的id设置组件的名称。

Vue.component('my-component',Vue.extend({/*...*/}));

Vue.component('my-component',{/*...*/});var MyComponent = Vue.component('my-component');

Vue.extend前面我们已经讲过,不了解的可以看下这篇文章:学习vue源码(2) 手写Vue.extend方法

(3)Vue.component只是注册或获取组件

(4)原理

Vue.options['components'] = Object.create(null);

Vue.component = function(id,definition){ if(!definition){  return this.options['components'][id]; }else{  if(isPlainObject(definition)){   definition.name = definition.name || id;   definition = Vue.extend(definition);  }  this.optipns['components'][id] = definition;  return definition; }}

1、在Vue.options中新增了components属性用于存放组件,并在Vue.js上新增了component方法,它接收两个参数id和definition。

2、Vue.component方法可以注册或获取过滤器,这取决于definition参数是否存在。

3、如果definition不存在,则使用id从this.options['components']中读出组件并将它返回。

4、如果definition存在,则说明是注册操作,那么需要将组件保存到this.optipns['components']中。

5、由于definition参数支持两种参数,分别是选项对象和构造器,而组件其实是一个构造函数,是使用Vue.extend生成的子类,所以需要将参数definition同一处理成构造器。

6、如果definition参数是Object类型,则调用Vue.extend方法将它变成Vue的子类,使用Vue.component方法注册组件。

7、如果选项对象中没有设置组件名,则自动使用给定的id设置组件的名称。

四、合并Vue.directive、Vue.filter、Vue.component代码

Vue.options = Object.create(null);

ASSET_TYPES.forEach(type=>{ Vue.options[type+'s'] = Object.create(null);})ASSET_TYPES.forEach(type=>{ Vue[type] = function(id,definition){  if(!definition){   return this.options[type+'s'][id];  }else{   if(type==='component' && isPlainObject(definition)){    definition.name = definition.name || id;    definition = Vue.extend(definition);   }   if(type==='directive' && typeof definition === 'function'){    definition = { bind: definition,update: definition};   }   this.optipns['components'][id] = definition;   return definition;  } }})

文章参考:深入浅出Vue

vue filter对象_学习vue源码(3) 手写Vue.directive、Vue.filter、Vue.component方法相关推荐

  1. Vue 源码之手写Vue Router

    Vue 源码之手写Vue Router 源码地址:https://github.com/CONOR007/Handwritten-routing 一.Vue Router的两种模式 hash模式实现原 ...

  2. Vue源码分析-手写Vue(简易版)

    1.Vue双向绑定/MVVM响应式原理/v-model的原理 vue.js通过数据劫持结合发布订阅者模式,通过Object.defineProperty来劫持各个属性的setter,getter,在数 ...

  3. idea zookeeper的使用_学习ZooKeeper源码,就从这篇开始吧

    [ZooKeeper系列]1.ZooKeeper单机版.伪集群和集群环境搭建 [ZooKeeper系列]2.用Java实现ZooKeeper API的调用 在系列的前两篇文章中,介绍了ZooKeepe ...

  4. mysql数据库源码安装_学习笔记-源码安装mariadb 20210128

    源码安装Mariadb数据库 安装之前先检查一下空间: 1 [15:13:16 root@centos8 ~]#free -h(#检查空间)2 total used free shared buff/ ...

  5. 这份1307页Android面试全套真题解析,源码+原理+手写框架

    前言 前不久,几个朋友聚会,谈到了现在的后辈,我就说起了那个大三就已经拿到网易offer的小学弟. 这个学弟是00后,专升本进入我们学校的.进来后就非常努力,每次上课都是第一个到教室的,每次都是坐第一 ...

  6. 字节跳动面试:一线互联网大厂面试真题系统收录!源码+原理+手写框架

    一.认识鸿蒙 鸿蒙 微内核是基于微内核的全场景分布式OS,可按需扩展,实现更广泛的系统安全,主要用于物联网,特点是低时延,甚至可到毫秒级乃至亚毫秒级. 鸿蒙OS实现模块化耦合,对应不同设备可弹性部署, ...

  7. 百度、阿里、滴滴、新浪的面试心经总结,源码+原理+手写框架

    前言 作为一个程序员,如果你在新知识.新技术面前仍一无所知,依然吃着十多年前的老本,那你在知识技术上肯定落伍,如果又未能进入管理层面,那你肯定就会被长江的后浪拍在沙滩上了. 而不少与时俱进.善于学习的 ...

  8. 面试必会之ArrayList源码分析手写ArrayList

    作者:Java知音-微笑面对生活 简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于 ...

  9. Android性能优化最佳实践,源码+原理+手写框架

    前言 众所周知,Android是一个基于Linux实现的操作系统.但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别. 所以An ...

最新文章

  1. codevs 2075 yh女朋友的危机
  2. com.squareup.okhttp.Interceptor
  3. iOS架构-静态库.framework之依赖第三方库(7)
  4. hdu 4362(单调队列优化dp)
  5. P7 计算机的性能指标
  6. php ajax jquery 表单重复提交,jQuery的 $.ajax防止重复提交的两种方法(推荐)
  7. 牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
  8. 输入两个长度相同的字符串,比较两个数在相同位置的字符是否相同
  9. python求多条最短路径_Python实现最短路径算法(Dijkstra's algorithm)
  10. android studio读写txt,Android Studio从.txt文件读取/写入,保存路径?
  11. python多线程_干货|理解python多线程和多进程
  12. CSS默认可继承样式
  13. mysql驱动和版本问题_MysqlJDBC驱动版本与Mysql版本的对应问题解决
  14. HEG安装教程(windows平台)
  15. 禁止触摸屏触控板手指缩放,需要这样处理
  16. 【SpringBoot】Error creating bean with name ‘methodValidationPostProcessor‘ defined in class path reso
  17. 云原生Tekton之触发器Trigger
  18. 最全MySQL8.0实战教程 14 MySQL的存储过程 14.1 概述
  19. 计算机软著进行转让的步骤
  20. 深圳商报 | 跨境电商大会聚焦跨境收款难题

热门文章

  1. python2好还是python3好-总结对比Python2和Python3之间的区别
  2. python打开一个文件-python下几种打开文件的方式
  3. python中一共有多少个关键字-Python中有几个关键字
  4. python少儿编程 在线课程-宁波Python程序开发课程
  5. python创建新文件-Python创建文件和追加文件内容实例
  6. python有道翻译接口-【Python】Python利用有道翻译开发API应用示例
  7. python编程小游戏-python趣味入门——写几个常玩的游戏
  8. 进入docker容器之后,找不到rosbag命令(ros已经安装)
  9. Windows10下git bash中添加wget下载工具
  10. 2_初学者快速掌握主流深度学习框架Tensorflow、Keras、Pytorch学习代码(20181211)