Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Vue如何创建自定义指令?

Vue如何创建自定义指令?

作者头像
Javanx
发布于 2019-09-04 04:56:33
发布于 2019-09-04 04:56:33
1.9K00
代码可运行
举报
文章被收录于专栏:web秀web秀
运行总次数:0
代码可运行

前言

什么是vue指令了? Vue自带的指令很多,v-for/v-if/v-else/v-else-if/v-model/v-bind/v-on/v-show/v-html/v-text... 原来这就是指令。

但是这些指令都是比较偏向于工具化,有些时候在实现具体的业务逻辑的时候,发现不够用,如何来自定义指令?

全局指令

第一步

最好建立一个全局的命令文件例如:directive.js 利用Vue.directive()建立一个全局命令,并将它暴露出来,例如一个focus 让表单自动聚焦

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// directive.js
import Vue from 'vue';

const focus = Vue.directive('focus', {
    // 指令的钩子函数--第一次绑定元素时调用
    bind(el) {
        console.warn('指令的钩子函数:bind');
        console.log(el);
    },
    /**
    * inserted 在元素被插入到页面中的时候调用---vm实例的钩子函数
    * binding是一个对象,包括指令的所有信息
    */
    inserted: function (el, binding) {
        el.focus();
        el.setAttribute('placeholder', 'web秀');
        // 自动聚焦,input提示placeholder输入 "web秀"

        // 其中foo是指令参数--可以打印看看
        console.log(binding.arg);
    },
    // 指令的钩子函数,只调用一次,指令与元素解绑时调用(即当标签被删除时)。
    unbind() {
        // 当指令所在的元素,从页面中移除的时候,unbind钩子函数会被执行
        console.warn('指令的钩子函数:unbind');
    }
})

export {focus}
第二步

在main.js(入口JS文件)中将它引入,可以省略文件后缀

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// main.js
import focus from 'xxx/directive'

这样任何一个Vue文件只有使用v-focus(指令名),就可以很方便的自动聚焦了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="text" v-focus:foo="我是指令参数">

局部指令

用法和全局指令一样,只是在单个Vue实例页面内部定义,只能被这一个实例使用,而全局可以被多个实例使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div>
    <input type="text" v-focus:foo="我是指令参数">
</div>

<script>
var vm = new Vue({
  el: '#app',
  data: {
  },
  directives:{
    focus:{
      // 创建局部指令
      inserted: function (el, binding) {
        el.focus();
        el.setAttribute('placeholder', 'web秀');
      })
    }
  }
})
</script>

自定义指令钩子函数参数介绍

函数

  1. bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  2. inserted:被绑定元素插入父节点时调用 (父节点存在即可调用,不必存在于 document 中)。
  3. update:所在组件的 VNode 更新时调用,但是可能发生在其孩子的 VNode 更新之前。指令的值可能发生了改变也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
  4. componentUpdated:所在组件的 VNode 及其孩子的 VNode 全部更新时调用。
  5. unbind:只调用一次,指令与元素解绑时调用。

参数

  1. el:指令所绑定的元素,可以用来直接操作 DOM 。
  2. binding:一个对象,包含以下属性: name:指令名,不包括 v- 前缀。 value:指令的绑定值,例如:v-my-directive="1 + 1", value 的值是 2。oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。 expression:绑定值的字符串形式。例如 v-my-directive="1 + 1" ,expression 的值是 "1 + 1"。 arg:传给指令的参数。例如 v-my-directive:foo,arg 的值是 "foo"。 modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。
  3. vnode:Vue 编译生成的虚拟节点,查阅 VNode API 了解更多详情。
  4. oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

学以致用

最后我们来写一个非常实用的栗子,页面倒计时,请上眼

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function padZero(number) {
  let tmp = "0" + number;
  return tmp.slice(-2, tmp.length);
}

function countDown(diff) {
  // 剩余毫秒
  let millisecond = diff % 1000;
  // 总秒
  let seconds = (diff - millisecond) / 1000;
  // 剩余秒数
  let realseconds = seconds % 60;
  // 剩余分钟数
  let minutes = (seconds - realseconds) / 60;
  // let realminutes = seconds % 60;
  // let hours = (diff - minutes - seconds) % 86400;
  return diff >= 0 ? padZero(minutes) + "分" + padZero(realseconds) + "秒" : "";
}
...
directives: {
    timer: {
      inserted(el, binding, vnode) {
        const me = vnode.context;
        const flight = me.$store.state.flight;
        // 获取参数,截止时间与当前时间差(单位毫秒)
        let val = +binding.value;
        let timer = window.setInterval(() => {
          val -= 1000; // 每秒减1000毫秒/1秒
          let instance = countDown(val);
          if (!instance) {
            // 倒计时结束,do something
            if (timer) {
              window.clearInterval(timer);
              timer = null;
            }
            return;
          }
          // 格式化的日期插入到页面
          el.innerHTML = instance;
        }, 1000);
      }
    }
}
...

页面可以直接使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 截止时间与当前时间差(单位毫秒) -->
<span v-timer='100000'></span>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年11月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue学习笔记11-自定义指令
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 注册指令的关键字是directive, 同样也有局部和全局之分,区别方式和组件相同。 全局:
雪地二货
2018/09/18
3400
​Vue自定义指令:深度解析与实战应用
大家好,我是腾讯云开发者社区的 Front_Yue,本篇文章将深入解析 Vue 自定义指令的原理、用法和实战应用,帮助开发者更好地掌握此功能。
Front_Yue
2024/04/17
2640
​Vue自定义指令:深度解析与实战应用
阿里前端面试问到的vue问题
虽然文档不建议在应用中直接使用 mixin,但是如果不滥用的话也是很有帮助的,比如可以全局混入封装好的 ajax 或者一些工具函数等等。
bb_xiaxia1998
2022/10/29
9360
Vue.js-自定义指令 原
除了默认设置的核心指令(v-model 和v-show),Vue也允许注册自定义指令。注意在Vue2.0里面,代码复用的主要形式和抽象是组件--然而,有的情况下,你 仍然需要对纯DOM元素进行底层操作,这时候就会用到自定义指令。下面这个例子将聚焦一个input元素,像这样在页面加载时,元素将获得焦点(注意,autofocus在移动版Safari上不工作),事实上,你访问后还没点击任何内容,input就获得了焦点,现在让我们完善这个指令:
tianyawhl
2019/04/04
8840
【VUE】vue2.x与vue3.x中自定义指令详解
vue自定义指令(2.x丨3.x)可以帮助我们实现需要操作,比如防抖、节流、懒加载、输入框自动聚焦等等,使用起来非常方便,比如vue自带的v-text、v-html、v-show、v-if等等。
不叫猫先生
2023/11/19
3600
【VUE】vue2.x与vue3.x中自定义指令详解
23. Vue 自定义指令
可以看到上面的输入框在刷新页面并没有进行自动聚焦,那么这时候可以使用自定义一个focus()方法来处理。 还有能否在刷新页面的时候,可以设置value在文本框中以及设置字体颜色呢? 能否进而通过传参的方式设置字体颜色呢?
Devops海洋的渔夫
2020/03/25
1.3K0
vue自定义指令
vue除了提供了v-model、v-show、v-if等默认指令,还允许注册了自定义指令。比如在需要对DOM元素进行底层操作的时候,就会用到自定义指令。
用户3258338
2019/07/19
6500
vue自定义指令
详细解析Vue自定义指令:一看就会的教程
Vue提供的指令方便了我们开发,有时我们需要对DOM 底层进行操作,就可以用自定义指令。
程序员海军
2023/11/25
3730
面试官:你有写过自定义指令吗?自定义指令的应用场景有哪些?
指令系统是计算机硬件的语言系统,也叫机器语言,它是系统程序员看到的计算机的主要属性。因此指令系统表征了计算机的基本功能决定了机器所要求的能力
@超人
2021/02/26
1.7K0
面试官:你有写过自定义指令吗?自定义指令的应用场景有哪些?
开心档之Vue教程2
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。
iOS程序应用
2023/04/17
3520
开心档之Vue教程2
写过自定义指令吗,原理是什么?
除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。举个聚焦输入框的例子,如下:
bb_xiaxia1998
2022/10/03
3450
vue directive 指令开发
指令适合处理简单的数据和对DOM的一些操作,v-focus,v-touch这种行为的一些操作适合用指令去实现。
上山打老虎了
2022/06/14
2880
vue directive 指令开发
Vue.js 自定义指令
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
陈不成i
2021/07/27
8510
VUE钩子函数
张哥编程
2024/12/19
1110
VUE钩子函数
Vue教程11(自定义指令)
  本文前面已经介绍了好几个系统提供的指令,比如"v-text",“v-bind”,"v-on"等等,本文我们来介绍下自定义指令的实现。
用户4919348
2019/07/18
5960
Vue教程11(自定义指令)
开心档之Vue教程2
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。
爱学iOS的小麦子
2023/03/02
4750
vue--自定义指令
[自定义指令]:https://cn.vuejs.org/v2/guide/custom-directive.html 自定义全局和局部的 自定义指令: ​ // 自定义全局指令 v-focus,为绑定的元素自动获取焦点: ​ Vue.directive('focus', { ​ inserted: function (el) { // inserted 表示被绑定元素插入父节点时调用 ​ el.focus(); ​ } ​ }); ​
eadela
2019/12/16
4230
vue初
指令总结 v-bind 可以绑定属性,包括class style,而已省略,使用:替代 在1vue.0中有三种修饰符,.sync,.once,.camel,在2.0中能够废弃了前面两个 .camel将绑定的特性的名称转化为驼峰法则命名
河湾欢儿
2018/09/06
1.1K0
19. Vue 自定义指令
可以看到上面的输入框在刷新页面并没有进行自动聚焦,那么这时候可以使用自定义一个focus()方法来处理。还有能否在刷新页面的时候,可以设置value在文本框中以及设置字体颜色呢?能否进而通过传参的方式设置字体颜色呢?
Devops海洋的渔夫
2022/01/17
1.2K0
19. Vue 自定义指令
vue自定义指令-对象式
对象式自定义指令是一种基于对象的方式创建指令。我们可以通过一个包含选项和钩子函数的对象来定义指令的行为。对象式指令可以包含以下选项和钩子函数:
堕落飞鸟
2023/05/21
2710
相关推荐
vue学习笔记11-自定义指令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验