vue 自定义指令

2023-05-16

指令包含有四个生命周期的钩子函数:

 可以局部注册,也可以全局注册。

// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})
//局部注册
directives: {
  focus: {
    // 指令的定义
    inserted: function (el) {
      el.focus()
    }
  }
}
//模版使用
<input v-focus>

钩子函数的参数:

el:指令所绑定的元素,可以用来直接操作 DOM。

binding:一个对象,包含以下 property:

        name:指令名,不包括 v- 前缀。

        value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。

        oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。

        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:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行

示例:

Vue.directive('demo', {
  bind: function (el, binding, vnode) {
    var s = JSON.stringify
    el.innerHTML =
      'name: '       + s(binding.name) + '<br>' +
      'value: '      + s(binding.value) + '<br>' +
      'expression: ' + s(binding.expression) + '<br>' +
      'argument: '   + s(binding.arg) + '<br>' +
      'modifiers: '  + s(binding.modifiers) + '<br>' +
      'vnode keys: ' + Object.keys(vnode).join(', ')
  }
})

new Vue({
  el: '#hook-arguments-example',
  data: {
    message: 'hello!'
  }
})
<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>

动态创建指令:

指令的参数可以是动态的。例如,在 v-mydirective:[argument]="value" 中,argument 参数可以根据组件实例数据进行更新!这使得自定义指令可以在应用中被灵活使用。

例如你想要创建一个自定义指令,用来通过固定布局将元素固定在页面上。我们可以像这样创建一个通过指令值来更新竖直位置像素值的自定义指令:

<div id="baseexample">
  <p>Scroll down the page</p>
  <p v-pin="200">Stick me 200px from the top of the page</p>
</div>
Vue.directive('pin', {
  bind: function (el, binding, vnode) {
    el.style.position = 'fixed'
    el.style.top = binding.value + 'px'
  }
})

new Vue({
  el: '#baseexample'
})

这会把该元素固定在距离页面顶部 200 像素的位置。但如果场景是我们需要把元素固定在左侧而不是顶部又该怎么办呢?这时使用动态参数就可以非常方便地根据每个组件实例来进行更新。

<div id="dynamicexample">
  <h3>Scroll down inside this section ↓</h3>
  <p v-pin:[direction]="200">I am pinned onto the page at 200px to the left.</p>
</div>
Vue.directive('pin', {
  bind: function (el, binding, vnode) {
    el.style.position = 'fixed'
    var s = (binding.arg == 'left' ? 'left' : 'top')
    el.style[s] = binding.value + 'px'
  }
})

new Vue({
  el: '#dynamicexample',
  data: function () {
    return {
      direction: 'left'
    }
  }
})

函数简写:

在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。比如这样写:

Vue.directive('color-swatch', function (el, binding) {
  el.style.backgroundColor = binding.value
})

对象字面量:

如果指令需要多个值,可以传入一个 JavaScript 对象字面量。记住,指令函数能够接受所有合法的 JavaScript 表达式。

Vue.directive('demo', function (el, binding) {
  console.log(binding.value.color) // => "white"
  console.log(binding.value.text)  // => "hello!"
})
<div v-demo="{ color: 'white', text: 'hello!' }"></div>

以上来自官网

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue 自定义指令 的相关文章

随机推荐

  • mysql远程登录

    MySQL5 7授权用户远程访问 做个记录 xff0c 每次弄环境的时候 xff0c 特别是弄mysql环境 xff0c 时不时都要用到下面的命令 命令如下 grant all privileges on to 39 root 39 64
  • zabbix5.0快速部署脚本

    bin bash 版本1 0 zabbix 43 nginx版本 welcome cat lt lt EOF 需要需改的配置文件有 xff1a 1 vi etc yum repos d zabbix repo zabbix源 2 vi et
  • openstack创建网络,路由等

    参考链接 xff1a https blog csdn net qq 28540443 article details 109184700 ops request misc 61 amp request id 61 amp biz id 61
  • shell脚本颜色

    https blog csdn net it chang article details 111084116
  • windows11 安装 vmare sphere client 无法启动问题

    被搞了两天特别记录一下 xff1a 现象 xff1a 安装什么都正常双击就是启动不了 解决 xff1a 控制面板 程序和功能
  • ceph delete pool

    参考 xff1a Pools Ceph Documentation 前言 xff1a 网上的写的乱七八糟不是你抄我就是我抄你 写的完全瞎扯 简直看不下去 官网截图 xff1a 准备 1 查看pool名称 ceph osd lspools 创
  • TODS:一款功能强大的多元时间序列异常检测工具

    TODS是一个全栈的自动化机器学习系统 xff0c 主要针对多变量时间序列数据的异常检测 该系统可以处理三种常见的时间序列异常检测场景 xff1a 点的异常检测 xff08 异常是时间点 xff09 模式的异常检测 xff08 异常是子序列
  • Linux防火墙firewalld安全设置

    背景描述 防火墙是具有很好的保护作用 攻击者必须首先穿越防火墙的安全防线 xff0c 才能接触目标计算机 在公司里数据安全是最重要的 xff0c 要求安全部门进行全公司进行服务器防火墙安全搭建 xff0c 在原有的基础上进行安全的防火墙设置
  • STM32F1--FreeRTOS系统学习(一):系统下载移植以及跑马灯测试

    以下内容皆是个人学习过程中的总结 xff0c 记录一下整个过程 xff0c 用于后期复习 xff0c 如有不对之处 xff0c 麻烦各位大佬指出 xff08 喜欢的朋友麻烦点个关注 后期还会进行持续更新 xff09 一 什么是FreeRTO
  • 如何准备国内一流互联网公司面试,如百度、阿里、腾讯、字节等

    入职新公司快半年了 xff0c 今天 xff0c 我就想和大家聊聊 xff0c 关于找工作 面试的一些心得与体会 说实话 xff0c 在这次找工作之前 xff0c 我面试找工作的经历并不丰富 xff0c 反而是当面试官的次数更多 所以呢 x
  • 基于 瑞芯微 RK1126 平台的项目总结(包含AI 画中画 RTSP OSD 录像 双路摄像头)

    其实这个项目结束一两个月了 中间过了个年 就把这事给忘记了 趁现在比较空记录一下 说下概况 项目是基于RK1126平台 硬件配置2个摄像头一个广角一个长焦 需要支持画中画在广角摄像头的画面中 显示长焦摄像头的大概位置 但是由于硬件还是驱动没
  • JavaScript小案例2-实现猜数游戏

    题目要求 xff1a 系统生成一个1 100的数 xff0c 然后让玩家猜数 如果玩家猜对该数 xff0c 则游戏结束 xff1b 如果没猜对 xff0c 则弹出警告框告告知玩家数字猜大了还是猜小了 xff0c 并提示玩家是否继续游戏 xf
  • 【Ubuntu】Linux文件系统简介

    Linux文件系统简介 Linux文件系统简介及类型1 Linux文件系统简介2 Linux文件系统类型 Linux文件系统结构文件操作指令创建新文件命令 touch创建文件夹命令 mkdir文件夹及目录删除命令 rm文件夹 目录 删除命令
  • 嵌入式实时操作系统(RTOS)

    一 项目准备工作 1 创建一个标准库项目 这里不用很麻烦 xff0c 项目能跑就行 xff0c 后面要以这个项目为基础移植 2 下载ucOS 源码 ucos 源码 百度网盘链接 xff1a 提取码 xff1a 1234 xff08 STM3
  • ROS环境安装与配置

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 实验环境一 ROS话题二 ROS消息三 C 43 43 编码实现小海龟圆周运动 提示 xff1a 以下是本篇文章正文内容 xff
  • solvepnp参数获取

    1 上参数 xff1a solvePnP 具体参数 xff1a objectPoints xff1a 特征点的世界坐标 xff08 3d点 xff09 xff0c 坐标值需为float型 xff0c 不能为double型 xff0c 可以为
  • 磁力计椭球拟合使用篇 IMU 加速度、电子罗盘校准

    磁力计校准椭球拟合使用篇 xff01 xff01 下方蓝色函数链接 xff01 xff01 matlab 椭球拟合函数链接 串口打印磁力计数据 xff0c 可以选择原始数据不进行任何缩放 xff08 前提是各轴向分辨率一致 xff09 sp
  • 数据结构与算法 — 希尔排序 和 快速排序

    目录 一 希尔排序 1 希尔排序的介绍 1 希尔排序的历史背景 2 插入排序的问题 3 希尔排序的做法 4 选择合适的增量 2 希尔排序的实现 3 希尔排序的效率 1 希尔排序的效率 2 Hibbard 增量序列 3 Sedgewick增量
  • MCU与MPU的区别

    CPU xff08 Central Processing Unit xff0c 中央处理器 xff09 发展出来三个分枝 xff0c 一个是DSP xff08 Digital Signal Processing Processor xff0
  • vue 自定义指令

    指令包含有四个生命周期的钩子函数 xff1a 可以局部注册 xff0c 也可以全局注册 注册一个全局自定义指令 96 v focus 96 Vue directive 39 focus 39 当被绑定的元素插入到 DOM 中时 insert