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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
NumPy从入门到放弃
公众号本文地址:https://mp.weixin.qq.com/s/EocThNWhQlI2zeLcUApsQQ
愷龍
2024/08/09
2160
NumPy从入门到放弃
numpy科学计算包的使用1
Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。其实,list已经提供了类似于矩阵的表示形式,不过numpy为我们提供了更多的函数。
听城
2018/04/27
1.3K0
numpy科学计算包的使用1
科学计算Python库:Numpy入门
NumPy 是 Python 中科学计算的基础包。它是一个 Python 库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。科学计算离不开numpy,学习数据分析必先学numpy!!! 本文由浅入深,对numpy进行入门介绍。讲解了创建数组、索引数组、运算等使用。
Crayon鑫
2023/10/10
4740
科学计算Python库:Numpy入门
Python Numpy基础:数组的创建与基本属性
在科学计算和数据分析领域,Python的Numpy库是一个不可或缺的工具。它提供了强大的多维数组对象,以及丰富的函数库,能够高效地处理大规模数据。本篇文章将详细介绍Numpy数组的创建方式与基本属性,帮助你更好地掌握这一基础知识,为深入学习和应用Numpy打下坚实的基础。
sergiojune
2024/08/14
3240
Python Numpy基础:数组的创建与基本属性
【深度学习】 NumPy详解(一):创建数组的n个函数
Python本身是一种伟大的通用编程语言,在一些流行的库(numpy,scipy,matplotlib)的帮助下,成为了科学计算的强大环境。本系列将介绍Python编程语言和使用Python进行科学计算的方法,主要包含以下内容:
Qomolangma
2024/07/29
2110
【深度学习】 NumPy详解(一):创建数组的n个函数
Python—numpy模块下函数介绍(一)numpy.ones、empty等
NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推。在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量。比如说,二维数组相当于是一个一维数组,而这个一维数组中每个元素又是一个一维数组。所以这个一维数组就是NumPy中的轴(axes),而轴的数量——秩,就是数组的维数。 首先来看看以np.ones为例的英文参数介绍 numpy.ones(shape, dtype=None, order=’C’) Return a new array of gi
学到老
2018/03/16
2.1K0
Python—numpy模块下函数介绍(一)numpy.ones、empty等
numpy入门-数组创建
Numpy 基础知识 Numpy的主要对象是同质的多维数组。Numpy中的元素放在[]中,其中的元素通常都是数字,并且是同样的类型,由一个正整数元组进行索引。 每个元素在内存中占有同样大小的空间。在Numpy中,维度被称为轴。例如对于[1, 2, 1]有一个轴,并且长度为3。而[[ 1., 0., 0.], [ 0., 1., 2.]]则有两个轴,第一个轴的长度为2,第二个轴的长度为3。 Numpy数组类的名字叫做ndarray,经常简称为array。要注意将numpy.array与标准Python库中的a
皮大大
2021/03/02
1.2K0
Python Numpy 数组
NumPy(Numeric Python,以numpy导入)是一系列高效的、可并行的、执行高性能数值运算的函数的接口。numpy模块提供了一种新的Python数据结构——数组(array),以及特定于该结构的函数工具箱。该模块还支持随机数、数据聚合、线性代数和傅里叶变换等非常实用的数值计算工具。
smartsi
2019/08/07
2.6K0
初探numpy——数组的创建
numpy.asarray方法可以将输入转换为ndarray,如果输入本身就是ndarray则不进行复制
LRainner
2020/07/15
1.9K0
Numpy 常用函数和属性(一)
np.arange([start,] stop[, step,], dtype=None) : 略(前面某篇介绍过)
用户6021899
2019/08/14
5490
NumPy:Python科学计算基础包
NumPy 是 Python 科学计算的基础包,几乎所有用 Python 工作的科学家都利用了的强大功能。此外,它也广泛应用在开源的项目中,如:Pandas、Seaborn、Matplotlib、scikit-learn等。
luckpunk
2023/09/26
3710
NumPy:Python科学计算基础包
jupyter notebook_numpy_1
Numerical Python(数值化的python) 1.numpy在内存运算上占有优势,核心数据类型叫做ndarray (n dimension array) 2.使用数组管理内存 3.numpy是一个并行计算的库(高密计算),不是直接由python进行封装的,是c语言封装的一个python库,它没有GIL锁. 4.numpy是python人工智能的基础库.其它的库都依赖于numpy. numpy中的数据类型¶ python中有自己的数据类型. numpy中的数据类型相对于python来说,更加的细致
以某
2023/03/07
3840
jupyter notebook_numpy_1
numpy入门25个案例
开始更新numpy相关的文章,本文介绍numpy中的25个小案例,主要内容是如何利用numpy来生成向量(一维数组),矩阵和高维数组等
皮大大
2023/08/23
4510
Python|Numpy的常用操作
Python中常用的基本数据结构有很多,通常我们在进行简单的数值存储的时候都会使用list来进行,但是list的缺点在于对于每一个元素都需要有指针和对象,对于数值运算来说,list显然是比较浪费内存和CPU计算时间的。为了弥补这种结构的不足,Numpy诞生了,在Numpy中提供了两种基本的对象:ndarray和ufunc。ndarray是存储单一数据类型的多维数组,ufunc则是能够对数组进行处理的函数。
数据山谷
2020/07/21
1.4K0
Python|Numpy的常用操作
Numpy70题,由浅入深!
NumPy(Numerical Python)是Python的一个开源的数值计算扩展,它提供了高效的多维数组对象ndarray,以及大量的数学函数库,用于处理大型矩阵和数组运算。
皮大大
2024/06/04
2240
Python必备基础:这些NumPy的神操作你都掌握了吗?
本文简单介绍NumPy模块的两个基本对象ndarray、ufunc,介绍ndarray对象的几种生成方法及如何存取其元素、如何操作矩阵或多维数组、如何进行数据合并与展平等。最后说明通用函数及广播机制。
IT阅读排行榜
2019/04/25
4.9K0
Python必备基础:这些NumPy的神操作你都掌握了吗?
numpy模块(对矩阵的处理,ndarray对象)
6.12自我总结 一.numpy模块 import numpy as np约定俗称要把他变成np 1.模块官方文档地址 https://docs.scipy.org/doc/numpy/referen
小小咸鱼YwY
2019/07/24
1K0
Python开发之numpy的使用
一、注意几点 NumPy 数组在创建时有固定的大小,不同于Python列表(可以动态增长)。更改ndarray的大小将创建一个新的数组并删除原始数据。 NumPy 数组中的元素都需要具有相同的数据类型,因此在存储器中将具有相同的大小。数组的元素如果也是数组(可以是 Python 的原生 array,也可以是 ndarray)的情况下,则构成了多维数组。 NumPy 数组便于对大量数据进行高级数学和其他类型的操作。通常,这样的操作比使用Python的内置序列可能更有效和更少的代码执行。 二、num
MiChong
2020/09/24
1.5K0
科学计算工具Numpy
Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库。用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多。本身是由C语言开发,是个很基础的扩展,Python其余的科学计算扩展大部分都是以此为基础。
周小董
2019/03/25
3.2K0
科学计算工具Numpy
数据可视化:认识Numpy
NumPy是一个开源的Python数据分析和科学计算库,全称为“Numerical Python”,主要用于数组计算。NumPy是作为数据分析必备库之一,是从事数据分析行业人员必要了解和学习的一个库,下面我们就来一起了解下NumPy。
马拉松程序员
2023/09/02
3380
数据可视化:认识Numpy
相关推荐
NumPy从入门到放弃
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验