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 版本自动生成文章摘要
Jul 23 Javascript
发一个自己用JS写的实用看图工具实现代码
Jul 26 Javascript
jquery ajax请求实例深入解析
Nov 26 Javascript
使用js检测浏览器的实现代码
May 14 Javascript
jquery checkbox实现单选小例
Nov 27 Javascript
Jquery获取和修改img的src值的方法
Feb 17 Javascript
使用nvm管理不同版本的node与npm的方法
Oct 31 Javascript
JavaScript实现简单动态进度条效果
Apr 06 Javascript
微信小程序事件 bindtap bindinput代码实例
Aug 26 Javascript
在vue项目实现一个ctrl+f的搜索功能
Feb 28 Javascript
react-router-dom 嵌套路由的实现
May 02 Javascript
Javascript中的解构赋值语法详解
Apr 02 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
使用数据库保存session的方法
2006/10/09 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
详解PHP中的Traits
2015/07/29 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
PHP 图片处理
2020/09/16 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
刷新页面实现方式总结(HTML,ASP,JS)
2008/11/13 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
python抽象基类用法实例分析
2015/06/04 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
python基本语法练习实例
2017/09/19 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
锐步英国官网:Reebok英国
2019/11/29 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
自我鉴定书范文
2013/10/02 职场文书
素质拓展感言
2014/01/29 职场文书
工作决心书范文
2014/03/11 职场文书
教师听课学习心得体会
2016/01/15 职场文书
python库sklearn常用操作
2021/08/23 Python