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 高效运行代码分析
Mar 18 Javascript
Js参数值中含有单引号或双引号问题的解决方法
Nov 06 Javascript
js的window.showModalDialog及window.open用法实例分析
Jan 29 Javascript
JavaScipt中栈的实现方法
Feb 17 Javascript
React.js入门实例教程之创建hello world 的5种方式
May 11 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
Jun 08 Javascript
javascript笔记之匿名函数和闭包
Feb 06 Javascript
js实现canvas图片与img图片的相互转换的示例
Aug 31 Javascript
jQuery实现的点击图片居中放大缩小功能示例
Jan 16 jQuery
如何在JavaScript中创建具有多个空格的字符串?
Feb 23 Javascript
浅谈JSON5解决了JSON的两大痛点
Dec 14 Javascript
JavaScript流程控制(分支)
Dec 06 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
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
修复IE9&amp;safari 的sort方法
2011/10/21 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
通过C++学习Python
2015/01/20 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
python tkinter界面居中显示的方法
2018/10/11 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
汽车技术服务英文求职信范文
2014/01/02 职场文书
关于读书的活动方案
2014/08/14 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android
Python max函数中key的用法及原理解析
2021/06/26 Python