前端框架Vue.js中Directive知识详解


Posted in Javascript onSeptember 12, 2016

Directive

看上去虽然和Angular中的定义类似,Directive 都是对DOM功能的一种拓展,但是 Vue 的 Directive 要弱的多。因为 Vue Component 其实本来就会包含对DOM的操作,所以大多数时候我们写一个通用组件都是一个Component 而不是一个 Directive,而 在 Angular 我们写一个通用的组件一般都是一个 Directive 。
所以我说 Vue 的 Directive 相比于 Angular 要弱的多,也可以说纯粹的多,他就是对 DOM 功能的一个拓展,而不是为了封装和DOM相关的逻辑。有兴趣可以通过对比这两个UI库就能明白:
 •Vux https://github.com/airyland/vux
 •Angular Bootstrap https://github.com/angular-ui/bootstrap 

对比就会发现,其实在 Vue 中我们封装一个通用的组件(其实不管是不是通用)都是一个 Component,但是在 Angular 中却是一个 Directive,因为 Angular 中的 Controller 其实只能创建一个 $scope 作用域。可以简单的认为在 Vue Directive = Angular Directive + Controller。前面讲到过 Vue 很多设计都和Angular2类似,Vue 中的 Directive 基本可以等价于 Angular2 的 Directive,但是千万不要和 Angular 中的 Directive 搞混了。

为了避免误导,所以后面不再拿 Angular Directive 作对比了。

生命周期

生命周期分为三步:
 •bind 第一次绑定到DOM元素上的时候触发
 •update bind完成之后立刻触发,以后每当参数更新的时候都会触发
 •unbind 解除和DOM元素的绑定时触发 

API 简洁到哭。。。
其中 update 是最重要的,也就是当 Directive 接收到一个值的更新的时候就会执行对应的代码。update函数接收的参数就是用户通过 Attr 传入的值。

我们下面实现一个简单的 Directive,它的作用是对 Todo List 输入的内容进行校验(表单校验)。Directive 基本结构如下:

Vue.directive("minlength", {
 bind: function() {
 },
 update: function(value) {
 },
 unbind: function() {
 }
});

 然后,我们需要在用户输入的时候进行校验,这里实现一个简单的 minlength 校验,代码如下:

Vue.directive("minlength", {
 bind: function() {
 var self = this;
 var el = this.el;
 el.addEventListener("keydown", function(e) {
  if(e.keyCode === 13) {
  if(el.value.length < self.minlength) {
   e.preventDefault();
  }
  }
 });
 var submit = el.parentNode.querySelector("button, [type='submit']");
 submit.disabled = true;
 el.addEventListener("keyup", function(e) {
  submit.disabled = (el.value.length < self.minlength);
 });

 },
 update: function(value) {
 this.minlength = parseInt(value);
 },
 unbind: function() {
 }
});

基本逻辑就在在 bind 阶段的时候就绑定事件,然后根据 update 时候传入的 minlength 值来进行判断。

目前看,Directive 应该就是为了实现类似的功能存在的,当然还有很多细枝末节的用法就不再细讲了。Directive 在 Vue 中并不是很重要的一块,大家平时写代码的时候更多还是写 Component。

Filter 和 Mixins 看起来比较简单,略过。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
Oct 23 Javascript
js arguments,jcallee caller用法总结
Nov 30 Javascript
jquery each的几种常用的使用方法示例
Jan 21 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
Dec 04 Javascript
javascript基础知识
Jun 07 Javascript
JavaScript中的splice方法用法详解
Jul 20 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
Nov 09 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
Nov 24 Javascript
浅谈Angular文字折叠展开组件的原理分析
Nov 24 Javascript
详解操作虚拟dom模拟react视图渲染
Jul 25 Javascript
浅谈vux之x-input使用以及源码解读
Nov 04 Javascript
解决Vue大括号字符换行踩的坑
Nov 09 Javascript
前端框架Vue.js构建大型应用浅析
Sep 12 #Javascript
jQuery过滤选择器用法示例
Sep 12 #Javascript
强大Vue.js组件浅析
Sep 12 #Javascript
超详细的JS弹出窗口代码大全
Apr 18 #Javascript
使用JS实现图片展示瀑布流效果的实例代码
Sep 12 #Javascript
关于javascript的一些知识以及循环详解
Sep 12 #Javascript
基于AngularJS实现iOS8自带的计算器
Sep 12 #Javascript
You might like
解析php中memcache的应用
2013/06/18 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
javascript globalStorage类代码
2009/06/04 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
学习面向对象之面向对象的基本概念:对象和其他基本要素
2010/11/30 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
JS中的三个循环小结
2017/06/20 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
python读取文本中的坐标方法
2018/10/14 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
Python collections模块的使用方法
2020/10/09 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
基于CSS3特效之动画:animation的应用
2013/05/09 HTML / CSS
美国羊皮公司:Overland
2018/01/15 全球购物
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
六一儿童节园长致辞
2015/07/31 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python
Ruby处理CSV数据方法详解
2022/04/18 Ruby