前端框架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用户自定义类的类名称的代码
Mar 08 Javascript
很全的显示阴历(农历)日期的js代码
Jan 01 Javascript
基于jQuery的Spin Button自定义文本框数值自增或自减
Jul 17 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
Jun 20 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
微信小程序 获取设备信息 API实例详解
Oct 02 Javascript
微信小程序 wxapp画布 canvas详细介绍
Oct 31 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
May 12 Javascript
浅谈react性能优化的方法
Sep 05 Javascript
详解Vue 动态组件与全局事件绑定总结
Nov 11 Javascript
js实现弹出框的拖拽效果实例代码详解
Apr 16 Javascript
node中使用shell脚本的方法步骤
Mar 23 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
php多文件上传下载示例分享
2014/02/20 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
承认错误的检讨书
2014/01/30 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
股指期货心得体会
2014/09/13 职场文书
2014年技术员工作总结
2014/11/18 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL