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教程
Jun 09 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
AngularJS学习笔记之ng-options指令
Jun 16 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
Nov 18 Javascript
极易被忽视的javascript面试题七问七答
Feb 15 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 Javascript
Knockoutjs 学习系列(二)花式捆绑
Jun 07 Javascript
老生常谈JQuery data方法的使用
Sep 09 Javascript
Vue框架中正确引入JS库的方法介绍
Jul 30 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
Oct 20 Javascript
深入浅析AngularJs模版与v-bind
Jul 06 Javascript
vue如何进行动画的封装
Sep 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中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
编写Python CGI脚本的教程
2015/06/29 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
Django中URL的参数传递的实现
2019/08/04 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
Python xlwt模块使用代码实例
2020/06/10 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
介绍Ibatis的核心类
2013/11/18 面试题
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
小学教师听课制度
2014/02/01 职场文书
房产委托公证书样本
2014/04/04 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
python 模块重载的五种方法
2021/04/24 Python