前端框架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 相关文章推荐
jQuery与ExtJS之选择实例分析
Aug 19 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
Jan 12 Javascript
JavaScript打印iframe内容示例代码
Aug 20 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
javascript记录文本框内文字个数检测文字个数变化
Oct 14 Javascript
9款2014最热门jQuery实用特效推荐
Dec 07 Javascript
js获取指定字符前/后的字符串简单实例
Oct 27 Javascript
vue中的非父子间的通讯问题简单的实例代码
Jul 19 Javascript
Vue3.x源码调试的实现方法
Oct 13 Javascript
vue 父组件通过v-model接收子组件的值的代码
Oct 27 Javascript
JS原型和原型链原理与用法实例详解
Feb 05 Javascript
vue实现移动端input上传视频、音频
Aug 18 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
分享一个Laravel好用的Cache宏
2015/03/02 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
js 金额文本框实现代码
2012/02/14 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
Python流程控制常用工具详解
2020/02/24 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
.net面试题
2015/12/22 面试题
建筑行业的大学生自我评价
2013/12/08 职场文书
高中数学教学反思
2014/01/30 职场文书
公司节能减排方案
2014/05/16 职场文书
表扬稿格式范文
2015/01/16 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Go 语言结构实例分析
2021/07/04 Golang
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android
bose降噪耳机音能消除人声吗
2022/04/19 数码科技