美文网首页
Vue自定义指令

Vue自定义指令

作者: KATENGC | 来源:发表于2020-04-24 17:09 被阅读0次

Vue开发过程中,我们经常会用到v-model、v-show等指令,那么我们是否能自定义指令呢?
根据Vue官方文档,Vue是允许注册自定义指令

那么自定义指令的使用场景是什么呢?
简单来说,当遇到一些需求没有复杂到需要通过封装组件的形式实现时,但是又不是一个简单的表达式可以解决,那么我们就可以用自定义指令来实现。这样说是不是还是很抽象,我来举个例子吧。
比方说,我们做一个电商的项目,通常会显示人民币的金额。如果这个项目是具有国际化的,那这个价格需要转换为人民币、美元、欧元等等。这个我们可以通过程序去做汇率的计算,然后用指令的方式实现是非常适合的。

结合官方的文档说明,我们来分析下自定义指令到底要如何实现呢?

Vue.directive('focus', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

1.声明自定义指令的名称(focus)
2.Vue.directive进行注册
3.设定一些钩子函数,来表示在什么时期做什么事情
钩子函数
一个指令定义对象可以提供如下几个钩子函数 (均为可选):

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

补充:Vue内置的默认指令v-if其实就是通过指令的值的变化使页面发生变化,实际上就是触发了update实现

接下来我们来看一下钩子函数的参数 (即 elbindingvnodeoldVnode)。
钩子函数参数(注意钩子函数参数的顺序)
指令钩子函数会被传入以下参数:

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

我们来实现一个简单的功能,将价格添加人民币价格符号(¥)
我们定义一个自定义指令,我这边命名为price吧,创建一个文件price.js(注意文件是js而非Vue)

import Vue from 'vue'

Vue.directive('price', {
  bind: function (el, binding) {
    el.innerHTML = '¥' + binding.value
  },
  update: function (el, binding) {
    el.innerHTML = '¥' + binding.value
  }
});

这里添加了两个钩子函数
bind在第一次绑定的时候调用,将输入的价格拼接上¥显示在DOM节点上;
update在值变化时调用,将输入的价格拼接上¥显示在DOM节点上;

现在我们来测试下
先在App.vue中引入这个文件

import 'components/price'

然后就可以使用了

<div v-price="10"></div>

效果如下:


image.png

这样自定义指令的简单功能就实现了!!!

相关文章

  • season2-全局API

    第1节:Vue.directive 自定义指令 Vue.directive自定义指令 自定义的指令:changec...

  • Vue div节点滚动事件-加载更多

    使用Vue.directive注册全局指令 绑定事件 对于Vue自定义指令不明白的同学请移步: Vue自定义指令 ...

  • VUE-2:自定义指令、事件

    directive自定义指令 我们还可以通过`Vue`提供的directive方法来自定义指令 注册指令 `vue...

  • vue入门6---vue基本指令、自定义指令、插件

    一、vue常用指令概览 二、vue自定义指令 注册全局指令Vue.directive('my-directive'...

  • vue自定义指令初探

    vue自定义指令初探 一、什么是自定义指令 自定义指令是用来操作DOM的。尽管Vue推崇数据驱动视图的理念,但并非...

  • vue 有自定义指令

    vue 的自定义指令,分为全局自定义指令和局部自定义指令,局部自定义指令等价于局部组件。 自定义指令可以对DOM进...

  • Vue指令钩子函数

    Vue指令上篇文章有讲过了,现在分析Vue指令钩子函数。 自定义指令 全局定义:Vue.directive( ' ...

  • vue自定义指令

    除了内置的指令外,Vue 也允许注册自定义指令。 vue用Vue.directive(id,definition)...

  • vue知识集锦(三)

    自定义指令 除了核心功能默认内置的指令 (v-model和v-show),Vue 也允许注册自定义指令。尽管Vue...

  • Vue基础(五)--自定义指令与过渡

    1.自定义指令 分类:全局指令、局部指令 1.1 自定义全局指令 使用全局方法 Vue.directive(指令I...

网友评论

      本文标题:Vue自定义指令

      本文链接:https://www.haomeiwen.com/subject/pzbfwhtx.html