Vue.JS的自定义指令应该如何使用

这次给大家带来vue.js自定义指令应该如何使用,使用vue.js的自定义指令的注意事项有哪些,下面就是实战案例,一起来看一下。

Vue.js 允许你注册自定义指令,实质上是让你教 Vue 一些新技巧:怎样将数据的变化映射到 DOM 的行为。你可以使用Vue.directive(id, definition)的方法传入指令id和定义对象来注册一个全局自定义指令。定义对象需要提供一些钩子函数(全部可选):

bind: 仅调用一次,当指令第一次绑定元素的时候。

update: 第一次是紧跟在 bind 之后调用,获得的参数是绑定的初始值;以后每当绑定的值发生变化就会被调用,获得新值与旧值两个参数。

unbind:仅调用一次,当指令解绑元素的时候。

立即学习“前端免费学习笔记(深入)”;

例子:

Vue.directive('my-directive', {  bind: function () {    // 做绑定的准备工作    // 比如添加事件监听器,或是其他只需要执行一次的复杂操作  },  update: function (newValue, oldValue) {    // 根据获得的新值执行对应的更新    // 对于初始值也会被调用一次  },  unbind: function () {    // 做清理工作    // 比如移除在 bind() 中添加的事件监听器  }})

登录后复制

一旦注册好自定义指令,你就可以在 Vue.js 模板中像这样来使用它(需要添加 Vue.js 的指令前缀,默认为 v-):

登录后复制

如果你只需要 update 函数,你可以只传入一个函数,而不用传定义对象:

Vue.directive('my-directive', function (value) {  // 这个函数会被作为 update() 函数使用})

登录后复制

所有的钩子函数会被复制到实际的指令对象中,而这个指令对象将会是所有钩子函数的this
上下文环境。指令对象上暴露了一些有用的公开属性:

el: 指令绑定的元素
vm: 拥有该指令的上下文 ViewModel
expression: 指令的表达式,不包括参数和过滤器
arg: 指令的参数
raw: 未被解析的原始表达式
name: 不带前缀的指令名

这些属性是只读的,不要修改它们。你也可以给指令对象附加自定义的属性,但是注意不要覆盖已有的内部属性。

使用指令对象属性的示例:

nbsp;html>            
Vue.directive('demoDirective', { bind: function () { this.el.style.color = '#fff' this.el.style.backgroundColor = this.arg }, update: function (value) { this.el.innerHTML = 'name - ' + this.name + '
' + 'raw - ' + this.raw + '
' + 'expression - ' + this.expression + '
' + 'argument - ' + this.arg + '
' + 'value - ' + value } }); var demo = new Vue({ el: '#demo', data: { msg: 'hello!' } })

登录后复制

多重从句

同一个特性内部,逗号分隔的多个从句将被绑定为多个指令实例。在下面的例子中,指令会被创建和调用两次:

登录后复制登录后复制

如果想要用单个指令实例处理多个参数,可以利用字面量对象作为表达式:

Vue.directive('demo', function (value) {  console.log(value) // Object {color: 'white', text: 'hello!'}})

登录后复制

字面指令

如果在创建自定义指令的时候传入 isLiteral: true ,那么特性值就会被看成直接字符串,并被赋值给该指令的 expression。字面指令不会试图建立数据监视。
例子:

Vue.directive('literal-dir', {  isLiteral: true,  bind: function () {    console.log(this.expression) // 'foo'  }})

登录后复制

动态字面指令

然而,在字面指令含有 Mustache 标签的情形下,指令的行为如下:

指令实例会有一个属性,this._isDynamicLiteral被设为true;

如果没有提供update函数,Mustache 表达式只会被求值一次,并将该值赋给this.expression。不会对表达式进行数据监视。

如果提供了update函数,指令将会为表达式建立一个数据监视,并且在计算结果变化的时候调用update。

双向指令

如果你的指令想向 Vue 实例写回数据,你需要传入 twoWay: true 。该选项允许在指令中使用 this.set(value)。

Vue.directive('example', {  twoWay: true,  bind: function () {    this.handler = function () {      // 把数据写回 vm      // 如果指令这样绑定 v-example="a.b.c",      // 这里将会给 `vm.a.b.c` 赋值      this.set(this.el.value)    }.bind(this)    this.el.addEventListener('input', this.handler)  },  unbind: function () {    this.el.removeEventListener('input', this.handler)  }})

登录后复制

内联语句

传入 acceptStatement: true 可以让自定义指令像 v-on 一样接受内联语句:

Vue.directive('my-directive', {  acceptStatement: true,  update: function (fn) {    // the passed in value is a function which when called,    // will execute the "a++" statement in the owner vm's    // scope.  }})

登录后复制

但是请明智地使用此功能,因为通常我们希望避免在模板中产生副作用。

深度数据观察

如果你希望在一个对象上使用自定义指令,并且当对象内部嵌套的属性发生变化时也能够触发指令的 update 函数,那么你就要在指令的定义中传入 deep: true。

Vue.directive('my-directive', {  deep: true,  update: function (obj) {    // 当 obj 内部嵌套的属性变化时也会调用此函数  }})

登录后复制

指令优先级

你可以选择给指令提供一个优先级数(默认是0)。同一个元素上优先级越高的指令会比其他的指令处理得早一些。优先级一样的指令会按照其在元素特性列表中出现的顺序依次处理,但是不能保证这个顺序在不同的浏览器中是一致的。

通常来说作为用户,你并不需要关心内置指令的优先级,如果你感兴趣的话,可以参阅源码。逻辑控制指令 v-repeat, v-if 被视为 “终结性指令”,它们在编译过程中始终拥有最高的优先级。

元素指令

有时候,我们可能想要我们的指令可以以自定义元素的形式被使用,而不是作为一个特性。这与 Angular 的 E 类指令的概念非常相似。元素指令可以看做是一个轻量的自定义组件(后面会讲到)。你可以像下面这样注册一个自定义的元素指令:

Vue.elementDirective('my-directive', {  // 和普通指令的 API 一致  bind: function () {    // 对 this.el 进行操作...  }})

登录后复制

使用时我们不再用这样的写法:

登录后复制登录后复制

而是写成:


登录后复制

元素指令不能接受参数或表达式,但是它可以读取元素的特性,来决定它的行为。与通常的指令有个很大的不同,元素指令是终结性的,这意味着,一旦 Vue 遇到一个元素指令,它将跳过对该元素和其子元素的编译 – 即只有该元素指令本身可以操作该元素及其子元素。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

相关阅读:

怎样在Android开发中与js进行交互

一个用Vue.js 2.0+做出的石墨文档样式的富文本编辑器

用Video.js实现H5直播界面

以上就是Vue.JS的自定义指令应该如何使用的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2784746.html

(0)
上一篇 2025年3月8日 17:15:00
下一篇 2025年3月8日 17:15:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Immutable.js详解

    这次给大家带来immutable.js详解,使用immutable.js的注意事项有哪些,下面就是实战案例,一起来看一下。 Immutable.js在react + router + redux项目中的应用 先介绍一下Immutable: …

    编程技术 2025年3月8日
    200
  • AngularJS之HelloWorld实例

    本文主要和大家分享angularjs之helloworld实例,希望能帮助到大家。 1、.angular-cli.json {  “$schema”: “./node_modules/@angular/cli/lib/config/sche…

    编程技术 2025年3月8日
    200
  • 前端关于Node.js的面试题

    这次给大家带来前端关于node.js的面试题,面试前端关于node.js岗位有哪些需要注意的,下面就是实战题目,一起来看一下。 【相关推荐:前端面试题(2020)】 如果你希望找一份有关Node.js的工作,但又不知道从哪里入手评测自己对N…

    编程技术 2025年3月8日
    200
  • js的Prototype属性用法详解

    每一个构造函数都有一个属性叫做原型(prototype,下面都不再翻译,使用其原文)。这个属性非常有用:为一个特定类声明通用的变量或者函数。 prototype的定义你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它…

    2025年3月8日
    200
  • 前端js打印(导出)excel表格的方法实例

    本文主要和大家分享前端js打印(导出)excel表格的方法实例,希望能帮助到大家。 产品原型: 图片.png 功能需求:点击导出考勤表格按钮,会自动下载成Excel格式 立即学习“前端免费学习笔记(深入)”; 图片.png 图片.png j…

    2025年3月8日
    200
  • AngularJS使用webApi导出数据

    本文主要和大家分享angularjs使用webapi导出数据代码实例,希望本文的代码能帮助到大家。  /////导出功能    self.importExcel = function () {        var dataUrl = “h…

    编程技术 2025年3月8日
    200
  • vue.js、element-ui、vuex环境搭建实例分享

    本文主要和大家分享vue.js、element-ui、vuex环境搭建实例,本文主要以图文实例和代码分享,希望能帮助到大家。 一、初始化项目 vue init webpack  登录后复制 二、初始化依赖包 npm install 登录后复…

    2025年3月8日 编程技术
    200
  • 六种JS数组去重的方法分享

    方法一: 双层循环,外层循环元素,内层循环时比较值 如果有相同的值则跳过,不相同则push进数组 本文主要和大家分享六种JS数组去重的方法,希望能帮助到大家。 Array.prototype.distinct =function(){ va…

    编程技术 2025年3月8日
    200
  • JS高级程序之DOM拓展

    11.1选择符api: SelectorsAPI的核心两个方法,:querySelector()和querySlelctorAll(),在兼容的浏览器中,可以通过Domcument及Element类型的实例可以调用他们。 11.1.1 qu…

    编程技术 2025年3月8日
    200
  • js多种字符串转换数字的方式详解

    在js读取文本框或者其他表单数据的时候获得的值是字符串类型的,当我们需要用其他数据类型时就必须要使用数据类型转换了,今天我们就来讲一下js对字符串转换为数字的多种方法! 在js读取文本框或者其他表单数据的时候获得的值是字符串类型的,比如两个…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论