vue3-自定义指令

自定义指令

vue 除了内置的制指令(v-model v-show 等)之外,还允许我们注册自定义的指令。

vue 复用代码的方式:

  1. 组件:主要是构建模块。

  2. 组合式函数:侧重有状态的逻辑。

  3. 自定义指令:主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。

定义:

一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。

示例:input 元素自动获取焦点

<script lang="ts" setup>
import { ref } from "vue";
// 在模板中启用 v-focus
const vFocus = {
  mounted: (el) => el.focus(),
};
</script>

<template>
  <div class="container">
    <input v-Focus />
  </div>
</template>

效果

该指令比 autofocus attribute 更有用,因为它不仅仅可以在页面加载完成后生效,还可以在 Vue 动态插入元素后生效。

在 <script setup> 中,任何以 v 开头的驼峰式命名的变量都可以被用作一个自定义指令。

将一个自定义指令全局注册到应用层级也是一种常见的做法:

const app = createApp({})

// 使 v-focus 在所有组件中都可用
app.directive('focus', {
  /* ... */
})

只有当所需功能只能通过直接的 DOM 操作来实现时,才应该使用自定义指令。其他情况下应该尽可能地使用 v-bind 这样的内置指令来声明式地使用模板,这样更高效,也对服务端渲染更友好。

指令钩子

const myDirective = {
  // 在绑定元素的 attribute 前
  // 或事件监听器应用前调用
  created(el, binding, vnode, prevVnode) {
    // 下面会介绍各个参数的细节
  },
  // 在元素被插入到 DOM 前调用
  beforeMount(el, binding, vnode, prevVnode) {},
  // 在绑定元素的父组件
  // 及他自己的所有子节点都挂载完成后调用
  mounted(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件更新前调用
  beforeUpdate(el, binding, vnode, prevVnode) {},
  // 在绑定元素的父组件
  // 及他自己的所有子节点都更新后调用
  updated(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件卸载前调用
  beforeUnmount(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件卸载后调用
  unmounted(el, binding, vnode, prevVnode) {}
}
钩子参数

指令的钩子会传递以下几种参数:

el:指令绑定到的元素。这可以用于直接操作 DOM。

binding:一个对象,包含以下属性。

value:传递给指令的值。例如在 v-my-directive="1 + 1" 中,值是 2。 oldValue:之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。 arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 "foo"。 modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。 instance:使用该指令的组件实例。 dir:指令的定义对象。 vnode:代表绑定元素的底层 VNode。

prevNode:代表之前的渲染中指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。

举例来说,像下面这样使用指令:

<div v-example:foo.bar="baz">

binding 参数会是一个这样的对象:

{
  arg: 'foo',
  modifiers: { bar: true },
  value: /* `baz` 的值 */,
  oldValue: /* 上一次更新时 `baz` 的值 */
}

和内置指令类似,自定义指令的参数也可以是动态的。举例来说:

<div v-example:[arg]="value"></div>

这里指令的参数会基于组件的 arg 数据属性响应式地更新。

除了 el 外,其他参数都是只读的,不要更改它们。若你需要在不同的钩子间共享信息,推荐通过元素的 dataset attribute 实现。

简化形式

对于自定义指令来说,一个很常见的情况是仅仅需要在 mounted 和 updated 上实现相同的行为,除此之外并不需要其他钩子。这种情况下我们可以直接用一个函数来定义指令,如下所示:

<div v-color="color"></div>

app.directive('color', (el, binding) => {
  // 这会在 `mounted` 和 `updated` 时都调用
  el.style.color = binding.value
})

对象字面量

如果你的指令需要多个值,你可以向它传递一个 JavaScript 对象字面量。别忘了,指令也可以接收任何合法的 JavaScript 表达式。

// 定义全局指令
app.directive('demo', (el, binding) => {
    //修该颜色
    el.style.color = binding.value.color
    //修该内容
    el.innerText = binding.value.text
})


// 文件内使用
<div v-demo="{ color: 'red', text: 'hello!' }"></div>

<template>
  <div class="container">
    <div v-demo="{ color: 'red', text: 'hello!' }"></div>
  </div>
</template>

效果:

在组件上使用

当在组件上使用自定义指令时,它会始终应用于组件的根节点,和透传 attributes 类似。

<MyComponent v-demo="test" />



<!-- MyComponent 的模板 -->

<div> <!-- v-demo 指令会被应用在此处 -->
  <span>My component content</span>
</div>

注意:

需要注意的是组件可能含有多个根节点。当应用到一个多根组件时,指令将会被忽略且抛出一个警告。

和 attribute 不同,指令不能通过 v-bind="$attrs" 来传递给一个不同的元素。总的来说,不推荐在组件上使用自定义指令。


欢迎关注,后面会有一些资源可以免费获取哟~

分享前后端编程经验,技术干货,技术方案,好用的开发工具和应用软件,人生经验感悟等

 

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

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

相关文章

大模型ReAct提示工程详解【2023】

普林斯顿大学的教授和谷歌的研究人员最近发表了一篇论文&#xff0c;描述了一种新颖的提示工程方法&#xff0c;该方法使大型语言模型&#xff08;例如 ChatGPT&#xff09;能够在模拟环境中智能地推理和行动。 这种 ReAct 方法模仿了人类在现实世界中的运作方式&#xff0c;即…

欧洲的编程语言三巨头,只剩下一位了!

能把三位大牛的名字都叫出来的人恐怕不多吧&#xff1a; 这三位都是图灵奖获得者&#xff0c;他们的名字和发明散布在各种教科书中&#xff0c;从左到右&#xff0c;依次是&#xff1a; 尼克劳斯沃斯 (Niklaus Wirth) 瑞士人&#xff0c;一生发明了8种编程语言&#xff0c;其中…

CTF赛三层内网渗透

CTF赛三层内网渗透 前言 2019某CTF线下赛真题内网结合WEB攻防题库&#xff0c;涉及WEB攻击&#xff0c;内网代理路由等技术&#xff0c;每台服务器存在Flag&#xff0c;获取一个Flag对应一个积分&#xff0c;获取三个Flag结束。 第一关 Taget1_centos7 1、访问目标网页 发现…

AIGC 为何能火爆全网,赋能智能时代?

Hi&#xff0c;大家好&#xff0c;我是半亩花海。2023年&#xff0c;人工智能新浪潮涌起&#xff0c;AIGC 火爆全网&#xff0c;不断赋能各大行业。从短视频平台上火爆的“AI 绘画”&#xff0c;到智能聊天软件 ChatGPT&#xff0c;都引起了大家的广泛关注。那么 AIGC 到底是什…

浙政钉访接口:k8s+slb容器日志报错(:Temporary failure in name resolution。)

在此我只能说兄弟&#xff0c;浙政钉的扫码接口和用户详情返回这两个接口是不需要白名单的&#xff0c; 我们文明人先确定一件事就是&#xff0c;你代码本地能调用到浙政钉返回。ecs服务器curl浙政钉也通的&#xff1a; 这时候和你说要开通白名单的&#xff0c;请放开你的道德…

r0下进程保护

简介 SSDT 的全称是 System Services Descriptor Table&#xff0c;系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表&#xff0c;它还包含着一些其它有用的信息&#xff0c;诸如地址索引的基地…

如何强制关掉系统或应用程序?这里提供详细方法

总的来说,Windows相当可靠,但有时会挂断并崩溃。我们如何在最少麻烦的情况下重返工作或游戏?为此,我们需要强制退出操作系统。 在本教程中,我们将向你展示如何在最坏的情况下安全关闭或重新启动计算机。我们还将向你展示如何在不触摸鼠标的情况下强制关闭应用程序和快速关…

【51单片机】开发板和单片机的介绍(2)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

挖矿系列:细说Python、conda 和 pip 之间的关系

继续挖矿&#xff0c;挖金矿&#xff01; 1. Python、conda 和 pip Python、conda 和 pip 是在现代数据科学和软件开发中常用的工具&#xff0c;它们各自有不同的作用&#xff0c;但相互之间存在密切的关系&#xff1a; Python&#xff1a;是一种解释型、面向对象的高级程序设…

【数据集】全国地级市-平均受教育年限-男、女数据集(2000-2020年)

平均受教育年限用以衡量地区的人力资本&#xff0c;指对一定时期、一定区域某一人口群体接受学历教育的年数总和的平均值。参考陈熠辉&#xff08;2023&#xff09;等人的计算方式&#xff0c;根据第五次人口普查、第六次人口普查、第七次人口普查结果整理了地级市的平均受教育…

CentOS下安装vlc

一、引言 vlc是一跨多媒体播放器&#xff0c;可以播放本地媒体文件和网络串流&#xff0c;帮助我们排查音视频开发过程中遇到的问题。大部分情况下&#xff0c;我们只需要在Windows系统下安装vlc就可以了。但有一种情况是需要在Linux下安装vlc的&#xff1a;我们的音视频拉流软…

2024美赛C题完整解题教程及代码 网球运动的势头

2024 MCM Problem C: Momentum in Tennis &#xff08;网球运动的势头&#xff09; 注&#xff1a;在网球运动中&#xff0c;"势头"通常指的是比赛中因一系列事件&#xff08;如连续得分&#xff09;而形成的动力或趋势&#xff0c;这可能对比赛结果产生重要影响。球…

打开率超90%的开发信标题,原来要这样写

写开发信时&#xff0c;邮件标题的撰写尤为重要&#xff0c;买家收到邮件的时候&#xff0c;在手机或其它移动设备上弹出来的信息就是邮件标题和正文第一句话。 好的标题能吸引买家打开邮件&#xff0c;开启高回复率的第一步&#xff0c;下面给大家介绍一下如何撰写高打开率的开…

Linux网络通信——TCP/OSI七层模型/TCP/IP(五层或四层模型)/HTTP报文传输原理

文章目录 消息的传输什么是OSI七层模型OSI七层模型的内容物理层&#xff08;Physical Layer&#xff09;&#xff1a;数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;网络层&#xff08;Network Layer&#xff09;&#xff1a;传输层&#xff08;Transport Lay…

vulhub中 Apache Airflow Celery 消息中间件命令执行漏洞复现(CVE-2020-11981)

Apache Airflow是一款开源的&#xff0c;分布式任务调度框架。在其1.10.10版本及以前&#xff0c;如果攻击者控制了Celery的消息中间件&#xff08;如Redis/RabbitMQ&#xff09;&#xff0c;将可以通过控制消息&#xff0c;在Worker进程中执行任意命令。 1.利用这个漏洞需要控…

css1字体属性

一.font-family(字体系列&#xff09; 不同字体系统用&#xff0c;隔开&#xff1b; 多个字母的字体系统用“”&#xff1b; 二.font-size&#xff08;字体大小&#xff09;&#xff08;有单位px&#xff09;&#xff08;默认字体16px&#xff09; 三.font-weight&#xff08…

linux虚拟机升级g++编译器版本

原先的 更新你的软件包列表&#xff1a; sudo apt update 添加Ubuntu Toolchain PPA&#xff08;Personal Package Archive&#xff09;&#xff0c;这是一个提供较新编译器版本的第三方软件源&#xff1a; sudo add-apt-repository ppa:ubuntu-toolchain-r/test 再次更新软件包…

gateway网关路由配置

搭建项目&#xff08;略&#xff09; gatewa配置文件 server:port: 9999 spring:application:name: gatewaycloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosgateway:routes:- id: api-service1uri: lb://user-login-api #服务名predicat…

Windows下MySQL的界面安装

华子目录 下载MySQL安装MySQL配置MySQL配置环境变量检验MySQL是否安装成功 下载MySQL 首先我们在MySQL的官方下载MySQL https://www.mysql.com 点击download&#xff0c;开始下载 安装MySQL 下载完成后&#xff0c;我们双击msi文件 再点击next 之后我们先勾选I acc…

Qt事件机制

文章目录 1 事件机制2 ignore 和 accept3 bool event(QEvent *event);4 bool eventFilter(QObject *watched, QEvent *event);5 总结 1 事件机制 事件传递图&#xff1a; 记录一下事件的传递顺序&#xff0c;主要围绕 QEventFilter, QEvent, QKeyEvent等事件展开&#xff1a…