Vue配置项之directives

news2025/1/13 7:36:36

Directives

首先说明一下,本人是前端小学生级别的菜鸡,吐槽的话请口下留情,在评论区指出错误或者补充不足,我会很喜欢,互喷不会进步,相互指点才会。。。。谢谢大家啦

目录

  • Directives
    • 目录
    • 自己定义
    • 官网简介
    • 钩子函数
    • 钩子函数参数
    • 动态指令参数
    • 对象字面量

📌Vue的自定义指令

自己定义

一、定义语法:

(1).局部指令:

  • directives:{} 指令名:配置对象
  • 或directives{指令名:回调函数}

(2).全局指令:

  • vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)

二、配置对象中常用的3个回调:

  1. bind:指令与元素成功绑定时调用。
  2. inserted:指令所在元素被插入页面时调用。
  3. update:指令所在模板结构被重新解析时调用。

三、备注:

  • 指令定义时不加v-,但使用时要加v-;
  • 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。

需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。

函数简写

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8" />
  <title>自定义指令</title>
  <script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>

  <!-- 准备好一个容器-->
  <div id="root">
    <h2>{{name}}</h2>
    <h2>当前的n值是:<span v-text="n"></span> </h2>
    <!-- <h2>放大10倍后的n值是:<span v-big-number="n"></span> </h2> -->
    <h2>放大10倍后的n值是:<span v-big="n"></span> </h2>
    <button @click="n++">点我n+1</button>
    <hr />
  </div>
</body>

<script type="text/javascript">
  Vue.config.productionTip = false
  new Vue({
    el: '#root',
    data: {
      name: 'akun',
      n: 1
    },
    directives: {
      //big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。
      /* 'big-number'(element,binding){
        // console.log('big')
        element.innerText = binding.value * 10
      }, */
      big(element, binding) {
        console.log('big', this) //注意此处的this是window
        // console.log('big')
        element.innerText = binding.value * 10
      },
    }
  })

</script>

</html>

需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8" />
  <title>自定义指令</title>
  <script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>

  <!-- 准备好一个容器-->
  <div id="root">
    <input type="text" v-fbind:value="n">
  </div>
</body>

<script type="text/javascript">
  Vue.config.productionTip = false
  new Vue({
    el: '#root',
    directives: {
      fbind: {
        //指令与元素成功绑定时(一上来)
        bind(element, binding) {
          element.value = binding.value
        },
        //指令所在元素被插入页面时
        inserted(element, binding) {
          element.focus()
        },
        //指令所在的模板被重新解析时
        update(element, binding) {
          element.value = binding.value
        }
      }
    }
  })

</script>

</html>

全局自定义指令

  //定义全局指令
   Vue.directive('fbind',{
    //指令与元素成功绑定时(一上来)
    bind(element,binding){
      element.value = binding.value
    },
    //指令所在元素被插入页面时
    inserted(element,binding){
      element.focus()
    },
    //指令所在的模板被重新解析时
    update(element,binding){
      element.value = binding.value
    }
  }) 

官网简介

📌要实现自定义指令(Custom Directive)可以使用 Vue 提供的 directive 方法。指令中this式window

除了核心功能默认内置的指令 (v-modelv-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。举个聚焦输入框的例子,如下:

当页面加载时,该元素将获得焦点 (注意:autofocus 在移动版 Safari 上不工作)。事实上,只要你在打开这个页面后还没点击过任何内容,这个输入框就应当还是处于聚焦状态。现在让我们用指令来实现这个功能:

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

如果想注册局部指令,组件中也接受一个 directives 的选项:

directives: {
  focus: {
    // 指令的定义
    inserted: function (el) {
      el.focus()
    }
  }
}

然后你可以在模板中任何元素上使用新的 v-focus property,如下:

<input v-focus>

钩子函数

📌想要使用这些配置,就只能写成对象形式

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

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

我们会在稍后讨论渲染函数时介绍更多 VNodes 的细节。

  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

接下来我们来看一下钩子函数的参数 (即 elbindingvnodeoldVnode)。

Vue.directive('my-directive', {
  // 钩子函数
  bind: function (el, binding, vnode) {
     // 指令绑定时的处理逻辑(一上来) 
  },
  inserted: function (el, binding, vnode) {
     // 元素插入到 DOM 中时的处理逻辑 
  },
  update: function (el, binding, vnode, oldVnode) {
     // 组件更新时的处理逻辑/指令所在模板被重新解析时调用 
  },
  componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  
  unbind: function (el, binding, vnode) {
    // 指令与元素解绑时的处理逻辑
  }
});

钩子函数参数

指令钩子函数会被传入以下参数:

  • el:指令所绑定的元素,可以用来直接操作 DOM。
  • binding:一个对象,包含以下 property:
    • 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 钩子中可用。

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

这是一个使用了这些 property 的自定义钩子样例:

<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
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!'
  }
})

在这里插入图片描述

自定义指令的钩子函数包括 bindinsertedupdatecomponentUpdatedunbind。下面是一个例子,演示了如何使用所有这些钩子函数,并解释了它们的意义和作用:

<template>
  <div v-custom-directive="'red'" :custom-arg="'arg-value'" custom-modifier>
    Custom Directive Example
  </div>
</template>

<script>
export default {
  directives: {
    'custom-directive': {
      // bind 钩子函数,在元素与指令绑定时调用
      bind(el, binding, vnode) {
        console.log('bind hook');

        // el: 指令绑定的元素
        console.log('Element:', el);

        // binding: 指令对象,包含 name、value、oldValue、expression 等属性
        console.log('Binding:', binding);

        // vnode: 虚拟节点,包含一些有用的信息
        console.log('VNode:', vnode);
      },
      // inserted 钩子函数,在被绑定元素插入父节点时调用
      inserted(el, binding, vnode) {
        console.log('inserted hook');
      },
      // update 钩子函数,在组件更新时调用
      update(el, binding, vnode, oldVnode) {
        console.log('update hook');
      },
      // componentUpdated 钩子函数,在组件更新后调用
      componentUpdated(el, binding, vnode, oldVnode) {
        console.log('componentUpdated hook');
      },
      // unbind 钩子函数,在元素与指令解绑时调用
      unbind(el, binding, vnode) {
        console.log('unbind hook');
      }
    }
  }
};
</script>

<style scoped>
.red {
  color: red;
}
</style>

在这个例子中:

  • bind 钩子函数在元素与指令绑定时调用,用于进行一次性的初始化设置。它接收三个参数:
    • el: 指令绑定的元素。
    • binding: 指令对象,包含了与指令相关的信息。
    • vnode: 虚拟节点,包含了一些有用的信息。
  • inserted 钩子函数在被绑定元素插入父节点时调用。它接收的参数与 bind 钩子相同。
  • update 钩子函数在组件更新时调用,但不会触发子组件的更新。它接收的参数同样与 bind 钩子相同,以及额外的 oldVnode 参数,表示上一个虚拟节点。
  • componentUpdated 钩子函数在组件及其子组件更新后调用。它接收的参数与 update 钩子相同。
  • unbind 钩子函数在元素与指令解绑时调用,用于进行清理工作。它接收的参数同样与 bind 钩子相同。

这个例子中,自定义指令 v-custom-directive 被应用到一个 div 元素上,并提供了一些参数,包括颜色值 'red'、自定义参数 'arg-value',以及修饰符 custom-modifier。在控制台中你将看到每个钩子函数被调用时打印的信息。

动态指令参数

指令的参数可以是动态的。例如,在 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'
    }
  }
})

结果:

在这里插入图片描述

这样这个自定义指令现在的灵活性就足以支持一些不同的用例了。

对象字面量

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1819836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

摄影构图:如何处理对焦、快门、光圈、ISO 以及拍摄方式

写在前面 博文内容涉及摄影对焦模式、快门速度、光圈、ISO以及拍摄方式的简单介绍《高品质摄影全流程解析》 读书笔记整理理解不足小伙伴帮忙指正 &#x1f603; 生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真…

嵌入式学习记录6.13(qt day1)

一.思维导图 二.练习&#xff08;简单模拟tim界面&#xff09; 2.1代码 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("Tim");this->setWindowIcon(QIcon("C:\\Users\\zy\…

第P10周:Pytorch实现车牌识别

第P10周&#xff1a;Pytorch实现车牌识别 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 在之前的案例中&#xff0c;我们多是使用datasets.ImageFolder函数直接导入已经分类好的数据集形成Dataset&#xff…

[面试题]Java【虚拟机】

[面试题]Java【基础】[面试题]Java【虚拟机】 因为 Java 并发涉及到的内容会非常多&#xff0c;本面试题可能很难覆盖到所有的知识点&#xff0c;所以推荐 《深入拆解 Java 虚拟机》 。 走近 Java 什么是虚拟机&#xff1f; Java 虚拟机&#xff0c;是一个可以执行 Java 字…

cilium关闭vxlan

说明 操作 启用标志 yum -y install net-tools.x86_64 ifconfig | grep vxlan cilium_vxlan: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500修改相关配置 ks get cm cilium-config -oyaml | grep -E tunnel|ipv4-native-routing-cidr|auto-direct-node-routes…

python310: pip install Could not install packages (HTTPSConnectionPool)问题

一、问题描述 在使用pip install安装包或者升级pip版本&#xff08;pip install --upgrade pip&#xff09;时遇到以下错误&#xff1a; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ReadTimeoutError(…

淘宝镜像地址失效

1. 使用nvm安装node时候报错 报错内容 Get "https://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": tls: failed to verify certificate: x509: certificate has expired or is not yet valid:报错原因 淘宝镜像地址的证书过期了 解决 找到nvm安装的根目…

为什么说掌握心理学知识成为产品经理一门必修课?

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

猫不喝水有什么危害?我想了这招,主食冻干、主食罐头骗水很实用

猫咪如果长期不喝水&#xff0c;一直处于缺水状态&#xff0c;可能会出现一些健康问题。首先&#xff0c;它们可能会出现便秘、上火等症状。在高温的夏季&#xff0c;缺水的猫还容易有脱水中暑的情况&#xff0c;严重的甚至可能死亡。另外&#xff0c;长期饮水不足的猫、很容易…

Chisel入门——在windows系统下部署Chisel环境并点亮FPGA小灯等实验

Chisel入门——在windows系统下部署Chisel环境并点亮FPGA小灯等实验 一、chisel简介二、vscode搭建scala开发环境2.1 安装Scala官方插件2.2 java版本&#xff08;本人用的是jdk18&#xff09;2.3 下载Scala Windows版本的二进制文件2.4 配置环境变量2.5 scala测试2.6 vscode运行…

linuxcentos将本地库JAR/arr批量导入到Nexus3.x

背景 我们现在要搞一个私服maven来管理对应的依赖包&#xff0c;需要上传包。用nexus只能单个文件搞&#xff0c;批量导入不行&#xff0c;而且还要单独配置groupID什么的。不多BB,上教程 建脚本 vi mavenimport.sh内容是这个 #!/bin/bash # copy and run this script to t…

【Linux】进程_2

文章目录 五、进程2. 操作系统3. 进程 未完待续 五、进程 2. 操作系统 我们知道了操作系统是一个进行 软硬件 资源 管理 的 软件 。为什么要有操作系统呢&#xff1f;或者说&#xff0c;为什么要有操作系统的管理呢&#xff1f;操作系统的存在目的是为了对上提供一个良好的运行…

设计通用灵活的LabVIEW自动测试系统

为了在不同客户案例中灵活使用不同设备&#xff08;如采集卡、Modbus模块&#xff09;且保持功能一致的LabVIEW自动测试系统&#xff0c;需要采用模块化的软件架构、配置文件管理、标准化接口和良好的升级维护策略。本文从软件架构、模块化设计、配置管理、升级维护、代码管理和…

线上3d数字艺术展让您在市场竞争中更具优势

在传统电商中&#xff0c;高昂的引流成本和激烈的行业竞争让获客变得尤为困难。随着web3技术的发展和覆盖&#xff0c;产品交互3D数字云展厅融合先进的web3D开发技术&#xff0c;构建了一个沉浸式数字空间&#xff0c;让客户随时随地通过电子设备进入展厅&#xff0c;享受自由浏…

什么是水单❓一文教你看懂水单‼️

常用术语&#xff1a; 1.Value Date:打款时间; 2.Funding Account:汇款账户; 3.Funding Account Name:汇款账户名称; 4.Beneficiary Name:收款人名称; 5.Beneficiary Account Number:收款账户; 6.Beneficiary Bank:收款行; 7.SWIFT/BIC和Country/Region;Status:汇款状态…

Docker(一)-认识Docker

1.docker理念 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装&#xff0c;分发&#xff0c;部署&#xff0c;运行等生命周期的管理&#xff0c;使用户的应用及其运行环境能够做到”…

鸿蒙开发文件管理:【@ohos.volumeManager (卷管理)】

卷管理 该模块提供卷、磁盘查询和管理的相关功能&#xff1a;包括查询卷信息&#xff0c;对卷的挂载卸载、对磁盘分区以及卷的格式化等功能。 说明&#xff1a; 本模块首批接口从API version 9开始支持。API 9当前为Canary版本&#xff0c;仅供试用&#xff0c;不保证接口可稳…

Modbus转Profinet网关的IP地址怎么设置

在工业自动化领域&#xff0c;Modbus和Profinet是两种常用的通信协议&#xff0c;而网关可以实现不同协议之间的转换&#xff0c;使得不同设备能够互相通信。本文将详细介绍如何设置Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;的IP地址&#xff0c;让您轻松实现设…

使用MNIST数据集训练手写数字识别模型

一、MNIST数据集介绍 MNIST 数据集&#xff08;手写数字数据集&#xff09;是一个公开的公共数据集&#xff0c;任何人都可以免费获取它。目前&#xff0c;它已经是一个作为机器学习入门的通用性特别强的数据集之一&#xff0c;所以对于想要学习机器学习分类的、深度神经网络分…

springboot+vue3-学生信息管理系统

以下为学生信息管理的主要前端界面 项目仓库 CYHone/vue-student-ms: 学生信息管理系统前端界面 (github.com) 项目仓库 CYHone/student-ms-server: 学生信息管理系统后端代码 (github.com) 4.1、学生功能 登录界面可以以三种身份登录&#xff1a;学生、教师、管理员。 选…