前端框架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 设计模式学习 Singleton
Jul 27 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
Aug 28 Javascript
JS定时刷新页面及跳转页面的方法
Jul 04 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
Feb 20 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
Jun 27 Javascript
JS实现给对象动态添加属性的方法
Jan 05 Javascript
如何理解jQuery中的ajaxSubmit方法
Mar 13 Javascript
ES6新特性八:async函数用法实例详解
Apr 21 Javascript
jQuery表单验证之密码确认
May 22 jQuery
jQuery删除/清空指定元素的所有子节点实例代码
Jul 04 jQuery
layer更改皮肤的实现方法
Sep 11 Javascript
javascript之Object.assign()的痛点分析
Mar 03 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获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
vue 动态表单开发方法案例详解
2019/12/02 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
Python执行时间的计算方法小结
2017/03/17 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
Python中的集合介绍
2019/01/28 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
python中adb有什么功能
2020/06/07 Python
学python需要去培训机构吗
2020/07/01 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
保护环境倡议书500字
2014/05/19 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
MySQL中一条update语句是如何执行的
2022/03/16 MySQL