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 相关文章推荐
js tab效果的实现代码
Dec 26 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
Nov 14 Javascript
js关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
artDialog双击会关闭对话框的修改过程分享
Aug 05 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
Oct 11 Javascript
简单对比分析JavaScript中的apply,call与this的使用
Dec 04 Javascript
js表单中选择框值的获取及表单的序列化
Dec 17 Javascript
javascript跑马灯抽奖实例讲解
Apr 17 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
Aug 01 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
May 24 Javascript
Element Carousel 走马灯的具体实现
Jul 26 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
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
thinkphp分页集成实例
2017/07/24 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
python正则表达式及使用正则表达式的例子
2018/01/22 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
Flask框架配置与调试操作示例
2018/07/23 Python
pandas通过索引进行排序的示例
2018/11/16 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
如何理解python中数字列表
2020/05/29 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
医学护理毕业生自荐信
2013/11/07 职场文书
董事长职责范文
2013/11/08 职场文书
岗位职责的构建方法
2014/02/01 职场文书
户外宣传策划方案
2014/05/25 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
导游词之山东八大关
2019/12/18 职场文书
python实现简单反弹球游戏
2021/04/12 Python
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
mysql创建存储过程及函数详解
2021/12/04 MySQL