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 阻止javascript事件冒泡,获取控件ID值
Jun 27 Javascript
jqPlot Option配置对象详解
Jul 25 Javascript
两个Javascript小tip资料
Nov 23 Javascript
javascript测试题练习代码
Oct 10 Javascript
jquery插件开发之实现md5插件
Mar 17 Javascript
jQuery实现只允许输入数字和小数点的方法
Mar 02 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
Sep 28 Javascript
原生JS+Canvas实现五子棋游戏实例
Jun 19 Javascript
javascript计算对象长度的方法
Oct 25 Javascript
浅谈Node.js 沙箱环境
May 15 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 jQuery
原生js通过一行代码实现简易轮播图
Jun 05 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
php判断当前操作系统类型
2015/10/28 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
CI框架表单验证实例详解
2016/11/21 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
axios基本入门用法教程
2017/03/25 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
python实现红包裂变算法
2016/02/16 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
大一新生军训时的自我评价分享
2013/12/05 职场文书
法制宣传教育方案
2014/05/09 职场文书
会计求职自荐信
2014/06/20 职场文书
应届生面试求职信
2014/07/02 职场文书
行政助理岗位职责
2015/02/10 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技