Vue.directive使用注意(小结)


Posted in Javascript onAugust 31, 2018

指令钩子函数会被传入以下参数:

  1. el:指令所绑定的元素,可以用来直接操作 DOM 。
  2. binding:一个对象,包含以下属性:vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
    1. ◦name:指令名,不包括 v- 前缀。
    2. ◦value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
    3. ◦oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    4. ◦expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
    5. ◦arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
    6. ◦modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
  3. oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

具体事例

clickoutside.js

用途:clickoutside.js主要用于解决点解元素外的地方时执行函数  主要应用的常见有弹出层点击遮罩层是隐藏窗口,或者一些弹出层点击其他地方要消失的场景

v-clickoutside具体是怎么实现的

答:主要是通过在bind中定义函数 通过判断是否包含元素,执行binding.value函数

export default {
 /*
  @param el 指令所绑定的元素
  @param binding {Object} 
  @param vnode vue编译生成的虚拟节点
  */
 bind (el, binding, vnode) {
  const documentHandler = function(e) {  
   if(!vnode.context || el.contains(e.target)) {
    return false;
   }
   if (binding.expression) {
    binding.value(e)
   }
  }
 
   document.addEventListener('click', documentHandler)
 },
 update (el, binding) {
 
 },
 unbind(el) {
  document.removeEventListener('click', documentHandler);
 }
}

Vue.directive使用注意

首先,Vue.directive要在实例初始化之前,不然会报错,还有,定义的指令不支持驼峰式写法,也会报下面同样的错,虽然在源码中没有找到在哪里统一处理大小写,但是在有关directive的方法中捕捉到的指令命名统一变为小写,所以,还是用'-'或者'_'分割吧。

vue.js:491 [Vue warn]: Failed to resolve directive: xxx

然后,其定义方式有两种,一种是Vue.directive('xxx', function(el, bind, vNode){}),其中el为dom,vNode为vue的虚拟dom,bind为一较复杂对象,详情可见Vue-directive钩子函数中的参数的参数,还有一种,为

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

参数代表的含义,参见钩子函数描述

最后,要使用自定义的指令,只需在对用的元素中,加上'v-'的前缀形成类似于内部指令'v-if','v-text'的形式。

// Vue.directive
      Vue.directive('test_directive', function(el, bind, vNode){
        el.style.color = bind.value;
      });
      var app = new Vue({
        el: '#app',
        data: {
          num: 10,
          color: 'red'
        },
        methods: {
          add: function(){
            this.num++;
          }
        }
      });

当然,也可以将method中的方法加入,bind.value即为methods中的方法。

<div id="app">
      <div v-test_directive="changeColor">{{num}}</div>
      <button @click="add">增加</button>
    </div>

    <script type="text/javascript">
      // Vue.directive
      Vue.directive('test_directive', function(el, bind, vNode){
        el.style.color = bind.value();
      });
      var app = new Vue({
        el: '#app',
        data: {
          num: 10,
          color: 'red'
        },
        methods: {
          add: function(){
            this.num++;
          },
          changeColor: function(){
            return this.color;
          }
        }
      });

这种形式,可以模仿'v-once',并进行一定的复杂逻辑,但是想要完全达到'v-once',可能需要考虑Vue-directive的钩子函数各个周期。下面是固定num的值,使得add的方法无效。

<div id="app">
      <div v-test_directive="changeColor">{{num}}</div>
      <button @click="add">增加</button>
    </div>

    <script type="text/javascript">
      // Vue.directive
      Vue.directive('test_directive', function(el, bind, vNode){
        el.style.color = bind.value();
      });
      var app = new Vue({
        el: '#app',
        data: {
          num: 10,
          color: 'red'
        },
        methods: {
          add: function(){
            this.num++;
          },
          changeColor: function(){
            this.num = 20;

            return this.color;
          }
        }
      });

因为小生刚刚接触vue,所以,希望前辈能多加指点。也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 类型转换方法
Oct 24 Javascript
jquery子元素过滤选择器使用示例
Jun 24 Javascript
js中top的作用深入剖析
Mar 04 Javascript
Javascript的严格模式strict mode详细介绍
Jun 06 Javascript
Javascript 数组排序详解
Oct 22 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
Jun 16 Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 Javascript
基于React实现表单数据的添加和删除详解
Mar 14 Javascript
javascript 的变量、作用域和内存问题
Apr 19 Javascript
JavaScript实现微信号随机切换代码
Mar 09 Javascript
如何手动实现一个 JavaScript 模块执行器
Oct 16 Javascript
解决angular2 获取到的数据无法实时更新的问题
Aug 31 #Javascript
vue 项目中使用Loading组件的示例代码
Aug 31 #Javascript
解决Angular2 router.navigate刷新页面的问题
Aug 31 #Javascript
浅谈angularJS2中的界面跳转方法
Aug 31 #Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
Aug 31 #Javascript
Angular2之二级路由详解
Aug 31 #Javascript
基于jQuery ztree实现表格风格的树状结构
Aug 31 #jQuery
You might like
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
Python中字典的基础知识归纳小结
2015/08/19 Python
使用简单工厂模式来进行Python的设计模式编程
2016/03/01 Python
python得到单词模式的示例
2018/10/15 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
基于python实现文件加密功能
2020/01/06 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
python中time、datetime模块的使用
2020/12/14 Python
什么是属性访问器
2015/10/26 面试题
学院书画协会部门岗位职责
2013/12/01 职场文书
工业学校毕业生自荐信范文
2014/01/03 职场文书
平安工地建设方案
2014/05/06 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
关于工作经历的证明书
2014/10/11 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
2015教师年度考核评语
2015/03/25 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android