Vue配置项之directives

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!"
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python学习从0开始——Kaggle计算机视觉001

Python学习从0开始——Kaggle计算机视觉001 一、卷积分类器1.分类器2.训练分类器3.使用 二、卷积和RELU1.特征提取2.带卷积的过滤器定义3.激活&#xff1a;4.用ReLU检测5.使用 三、最大池化1.最大池压缩2.使用3.平移不变性 四、滑动窗口1.介绍2.步长3.边界4.使用 五、自定义Con…

58.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;57.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露&#xff08;5&#xff09;-CSDN博客…

数组(C语言)(详细过程!!!)

目录 数组的概念 一维数组 sizeof计算数组元素个数 二维数组 C99中的变⻓数组 数组的概念 数组是⼀组相同类型元素的集合。 数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般比较多见的是二维数组。 从这个概念中我们就可以发现2个有价值的信息&#xff1a;(1)数…

鸿蒙轻内核A核源码分析系列七 进程管理 (1)

本文开始继续分析OpenHarmony LiteOS-A内核的源代码&#xff0c;接下来会分析进程和任务管理模块。本文中所涉及的源码&#xff0c;以OpenHarmony LiteOS-A内核为例&#xff0c;均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_a 获取。如果涉及开发板&#xff…

如何翻译和本地化游戏?翻译访谈

如何翻译和本地化游戏&#xff1f;这个过程的技术细节有哪些&#xff1f;游戏翻译不同于电影翻译。Logrus IT游戏本地化部门负责人阿列克谢费奥多罗夫&#xff08;Alexey Fedorov&#xff09;在接受RUDN语言学系外语系教授和研究人员的采访时谈到了这一点&#xff0c;他是由尤利…

堆的应用——TOP-K问题

堆的应用——TOP-K问题 TOP-K 问题解决方法一、排序后选择二、简单数组维护三、使用堆优化简单数组方案 TOP-K 问题实例的堆代码参考(环境为VS2022的C语言)生成 1 千万个整数生成后检查文件建小堆处理问题验证正确性完整代码&#xff1a; TOP-K 问题 即求相同数据中前K个最大的…

【讯为Linux驱动开发】6.自旋锁spinlock

【自旋锁】 线程A获取自旋锁后&#xff0c;B假如想获取自旋锁则只能原地等待&#xff0c;仍占用CPU&#xff0c;不会休眠&#xff0c;直到获取自旋锁为止。 【函数】 DEFINE SINLOCK(spinlock t lock) 定义并初始化一个变量int spin lock init(spinlock t*lock) 初始化自…

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

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

docker-compose启动oracle11、并使用navicat进行连接

一、docker-compose.yml version: 3.9 services:oracle:image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11grestart: alwaysprivileged: truecontainer_name: oracle11gvolumes:- ./data:/u01/app/oracleports:- 1521:1521network_mode: "host"logging:d…

安卓/iOS/Linux系统影音边下边播P2P传输解决方案

在当今的数字时代&#xff0c;IPTV 影音行业正经历着快速的发展和变革&#xff0c;但影音行业的流量带宽成本一直很高&#xff0c;有没有什么办法既能保证现有的用户观看体验&#xff0c;又能很好降低流量带宽成本呢? P2P技术可能是一个很好的选择&#xff0c;它不仅仅可以提…

计算机组成原理(六)

0x12345678和12345678H都是指同一个十六进制,也就是12345678&#xff0c;不过是不同的编程语言的写法而已 具体来说&#xff0c;如果有 n 根地址线&#xff0c;计算机可以寻址的内存空间大小是 2^n 字节。 24根地址线&#xff1a; 如果一个系统有24根地址线&#xff0c;意味着它…

【日记】第一次养植物,没什么经验……(781 字)

正文 前两天梦见灵送的几盆植物全都死掉了。梦里好伤心。醒来与她说这件事&#xff0c;她宽慰我说&#xff0c;梦都是反着的&#xff0c;肯定能活得很好的。于是忽然记起昨天给植物换水时&#xff0c;文竹的根居然从花盆底部伸吊了出来&#xff0c;以前都没有这种情况来着&…

你知道古代青铜器的原色是什么吗?

在中国悠久的历史中&#xff0c;青铜器作为中华文明的瑰宝&#xff0c;一直以其独特的艺术魅力和深厚的文化内涵吸引着世人的目光。然而&#xff0c;对于大多数人来说&#xff0c;青铜器的形象往往与电视剧中的描绘有所出入。那些在剧中常见的青绿色青铜器&#xff0c;让许多观…

Kafka 负载均衡挑战及解决思路

本文转载自 Agoda Engineering&#xff0c;介绍了在实际应用中&#xff0c;如何应对 Kafka 负载均衡所遇到的各种挑战&#xff0c;并提出相应的解决思路。本文简要阐述了 Kafka 的并行性机制、常用的分区策略以及在实际操作中遇到的异构硬件、不均匀工作负载等问题。通过深入分…

使用Arthas查看方法的参数信息情况

使用Arthas查看方法的参数信息情况 前言 最近在排查一个bug&#xff0c;需要看看一个接口方法的传参&#xff0c;但是方法里并没有打印传参&#xff0c;而且还是生产环境&#xff0c;更新包也麻烦&#xff0c;所以&#xff0c;准备安装一下Arthas&#xff0c;通过Arthas可以做…

windows 11中如何设置默认为英文输入法

由于工作需要&#xff0c;我一直在windows7下使用VB6&#xff0c;以前尝试着使用新的系统&#xff0c;但都无法正常安装vb&#xff0c;最近几天由于系统一次作死操作&#xff0c;逼着我安装了win11&#xff0c;并且在其上正常安装了vb6&#xff0c;本想着十分高兴&#xff0c;终…

Ascend C 2.0新特性详解,支撑大模型融合算子高效开发

近日&#xff0c;昇腾算子编程语言Ascend C发布2.0版本&#xff0c;新增支持通算融合MC特性&#xff0c;使能大模型场景下通信和计算并行&#xff0c;提高整网运行性能&#xff1b;提供更丰富的API覆盖当前主流的融合算子开发场景&#xff0c;提升开发效率&#xff1b;同时通过…

大语言模型 (LLM) 红队测试:提前解决模型漏洞

大型语言模型 (LLM) 的兴起具有变革性&#xff0c;以其在自然语言处理和生成方面具有与人类相似的卓越能力&#xff0c;展现出巨大的潜力。然而&#xff0c;LLM 也被发现存在偏见、提供错误信息或幻觉、生成有害内容&#xff0c;甚至进行欺骗行为的情况。一些备受关注的事件包括…

clipboard.js(web页面实现点击复制)

文章目录 codeshow 一个很简单的需求&#xff0c;一个单页面需要一个点击复制的功能 后来在线上找到一个clipboard.js可以实现&#xff0c;这里只用到了最基础的用法&#xff0c;页面样式布局基于bootstrap5.2.3 code <div class"d-flex align-items-center justify-co…

字符设备驱动

目录 demo.c test.c led.h makefile 实验效果 demo.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include "myled.h" //内核buf char kbuf[…