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 相关文章推荐
IE JS无提示关闭窗口不提示的方法
Apr 29 Javascript
基于jquery的关于动态创建DOM元素的问题
Dec 24 Javascript
JavaScript中的style.display属性操作
Mar 27 Javascript
jquery实现背景墙聚光灯效果示例分享
Mar 02 Javascript
js实现的万能flv网页播放器代码
Apr 30 Javascript
浅谈html转义及防止javascript注入攻击的方法
Dec 04 Javascript
jquery插入兄弟节点的操作方法
Dec 07 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
Jul 04 Javascript
VueJS组件之间通过props交互及验证的方式
Sep 04 Javascript
vue实现的组件兄弟间通信功能示例
Dec 04 Javascript
Vuex 单状态库与多模块状态库详解
Dec 11 Javascript
JavaScript实现淘宝商品图切换效果
Apr 29 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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
PHP Reflection API详解
2015/05/12 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
Python卸载模块的方法汇总
2016/06/07 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
Python笔记之代理模式
2019/11/20 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
日语系毕业生推荐信
2013/11/11 职场文书
会议邀请函范文
2014/01/09 职场文书
亲子活动总结
2014/04/26 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
简历中自我评价范文
2015/03/11 职场文书
导游词之太湖
2019/10/08 职场文书
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server