Vue3 - 自定义指令封装

news2024/11/28 14:33:23

Vue3 - 自定义指令封装

  • 一. 自定义指令封装
    • 1.1 全局/局部注册自定义聚焦指令
    • 1.2 自定义指令相关参数
    • 1.3 自定义指令参数传递
  • 二. 总结

一. 自定义指令封装

vue中有很多内置的指令,我们一般在开发中也经常用到,比如v-if,v-for等等。那么本篇文章就来讲一讲如何自定义指令。

我们先来看下一个简单的功能,我们画一个简单的页面,然后页面里面有一个文本框:

<template>
  <div class="border">
    <h1 >我是父组件</h1>
    文本框:<inpu type="text">
  </div>
</template>
<script setup>

</script>

<style scoped>
.border {
  border: 1px solid;
  width: 400px;
  height: 200px;
}
</style>

运行结果如下:
在这里插入图片描述
那么如果我希望页面刚进入,就能聚焦到这个文本框中,该怎么做?我们这里就使用自定义指令的功能来完成。

1.1 全局/局部注册自定义聚焦指令

首先我们说下局部的定义方式,我们在首页中添加以下代码:

<script setup>
const vFocus = {
  mounted: (el) => {
    console.log('mounted');
    el.focus();
  },
};
</script>

然后再inpu标签上添加指令:<input v-focus type="text" />,那么页面刷新一下,效果如下:可见已经聚焦到文本框中,并且输出了对应的内容。
在这里插入图片描述

紧接着再来说下全局的注册,主要在main.ts入口文件中使用directive函数进行注册。这样任何一个组件中都可以使用指令:v-focus

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'

createApp(App)
    .directive('focus', {  
        // 当被绑定的元素挂载到 DOM 中时
        mounted(el) {    
            // 聚焦元素    
            el.focus()
        }
    })
    .mount('#app')

讲到这里,其实我并没有对指令的定义做出太多的解释,先把这个功能代码贴出来,接下来开始细讲。

1.2 自定义指令相关参数

大家可以从案例中看到,在定义自定义指令的时候,我们定义了一个mounted函数,其实除了他还有几个钩子函数。

  • created:在绑定元素的 attribute 前或事件监听器应用前调用。
  • beforeMount:当指令第一次绑定到元素上并且在父组件被挂载前调用。
  • mounted:在绑定元素的父组件及他自己的所有子节点都挂载完成后调用,一般我们自定义指令的逻辑都写在这里。
  • beforeUpdate:绑定元素的父组件及他自己的所有子节点都更新前调用。
  • updated:在绑定元素的父组件及他自己的所有子节点都更新后调用。
  • beforeUnmount:在父组件被卸载前调用。
  • unmounted:当指令和元素已经解除绑定并且父组件也已经被卸载的时候调用。

同样,我们还注意到,我们定义mounted钩子函数的时候,还传入了一个参数el,除此之外,还有三个参数,一共4个。

  • el(读写):指令所绑定的元素,可以直接操作DOM
  • binding(只读):通过自定义指令传递的参数都在这里。
  • vnode(只读):Vue编译生成的虚拟节点。
  • oldVnode(只读):上一个虚拟节点,仅仅在updatecomponentUpdated钩子函数中才可以使用。

1.3 自定义指令参数传递

我们来看下这个案例:

<template>
  <div class="border">
    <h2>我是父组件</h2>
    <button v-onceClick:{name:myName,age:10}="1">按钮1</button>
    <br>
    <button v-onceClick:{name:myName,age:10}="3">按钮3</button>
  </div>
</template>
<script setup>
const myName = "ljj";

const vOnceClick = {
  mounted: (el, binding, vnode) => {
    el.addEventListener("click", () => {
      if (!el.disabled) {
        el.disabled = true;
        let time = binding.value * 1000;
        setTimeout(() => {
          el.disabled = false;
        }, time);
      }
      console.log(binding.value,binding.arg)
    });
    console.log(vnode)
  },
};
</script>

<style scoped>
.border {
  border: 1px solid;
  width: 400px;
  height: 200px;
}
</style>

效果如下:
在这里插入图片描述
我们可以看到,首先打印的是Vue编译后的虚拟节点相关信息。之后基本上同时点击了两个按钮。一个置灰了1秒,一个置灰了3秒。符合代码编写。

我们把这段代码拆分开来说:v-onceClick:{name:myName,age:10}="3"

  • 冒号后面的是引入的值:{name:myName,age:10}这块部分,竟然是一个字符串,我们代码里面定义了myName变量,值是ljj。但是从输出结果来看,他并不是我们期望的。但是我们可以从binding.arg中拿到这个值。
  • 我们可以从binding.value中拿到="3"这部分的数据。

后来经过我的测验,针对第一点,我们这样改,传入一个单对象,使用中括号:

<button v-onceClick:[{name:myName,age:10}]="1">按钮1</button>
<br />
<button v-onceClick:[myName]="3">按钮3</button>

结果如下:
在这里插入图片描述

二. 总结

总结下自定义指令的封装相关知识点:

  • 自定义指令,我们一般需要定义一个对象,里面包含一个mounted函数,我们主要在这个函数中,对传入的el参数,操作DOM节点。编写自己的业务逻辑即可。
  • 如果希望往指令函数中传入相关的参数,可以通过 v-指令名称:[Obj]=val的写法来完成。
  • Obj则由mounted这样钩子函数的第二个参数binding对象中获得,即biding.arg
  • val则通过biding.value来获得。
  • 注意相关钩子函数中,一般我们只操作第一个参数el来控制DOM节点,其他参数一般是只读的。
  • 一般我们命名自定义指令 const v指令名称 = {}Vue3写法中v前缀一定要有,使用的时候则由 v-指令名称来指定。首字母大小写不影响。例如定义指令函数:vFocus,那么使用的时候v-focus或者v-Focus都可。

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

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

相关文章

Vue极简使用

Vue安装Vue模板语法安装Vue 安装nodejs 这里我安装的是14.5.4版本 https://nodejs.org/download/release/v14.15.4/解压后配置一下环境变量就行 安装cnpm镜像 (这个安装的版本可能过高&#xff0c;后面安装Vue可能出问题) npm install -g cnpm --registryhttps://registry…

二十二、Gtk4-ListView

GTK 4添加了新的列表对象GtkListView、GtkGridView和GtkColumnView。这个新特性在Gtk API参考—列表小构件概述中有描述。 GTK 4还有其他实现列表的方法。它们是GtkListBox和GtkTreeView&#xff0c;它们是从GTK 3接管的。在Gtk开发博客中有一篇关于Matthias Clasen所写的列表…

vscode执行Python输出exited with code=9009 in 0.655 seconds

vscode执行Python输出exited with code9009 in 0.655 seconds 想用vscode写个脚本&#xff0c;用自己电脑配置了下vscode的python环境&#xff0c;结果点击右上角三角图标运行时却只会输出exited with code9009 in 0.655 seconds 这就不太理解了&#xff0c;我在公司时是能正…

linux性能分析 性能之巅学习笔记和内容摘录

本文只是在阅读《性能之巅》的过程中&#xff0c;对一些觉得有用的地方进行的总结和摘录&#xff0c;并附加一些方便理解的材料&#xff0c;完整内容还请阅读Gregg的大作 概念和方法 性能分析领域一词的全栈代表了整个操作系统的软硬件在内的所有事物 软件生命周期和性能规划…

LabWindows CVI 2017开发笔记--串口API

参考资料&#xff1a;https://download.csdn.net/download/Stark_/87424565?spm1001.2014.3001.5501 转载请注明出处&#xff1a;https://blog.csdn.net/Stark_/article/details/128966962?spm1001.2014.3001.5501 打开串口OpenComConfig OpenComConfig 打开一个串行并进行…

HTML-CSS-js教程

HTML 双标签<html> </html> 单标签<img> html5的DOCTYPE声明 <!DOCTYPE html>html的基本骨架 <!DOCTYPE html> <html> </html>head标签 用于定义文档的头部。文档的头部包含了各种属性和信息&#xff0c;包括文档的标题&#…

【成为架构师课程系列】架构设计中的核心思维方法

架构设计中的核心思维方法 目录 前言 #一、抽象思维 #二、分层思维 #三、分治思维 #四、演化思维 #五、如何培养架构设计思维

leaflet 加载WKT数据(示例代码050)

第050个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载WKT文件,将图形显示在地图上。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果配置方式示例源代码(共67行…

中国特色地流程管理系统,天翎让流程审批更简单

编者按&#xff1a;本文分析了国内企业在采购流程管理系统常遇到的一些难点&#xff0c;并从适应中国式流程管理模式的特点出发&#xff0c;介绍了符合中国特色的流程审批管理系统——天翎流程管理系统。关键词&#xff1a;可视化开发&#xff0c;拖拽建模&#xff0c;审批控制…

威联通ContainerStation部署Oracle11g

文章目录前言部署过程详解使用docker-compose文件创建容器临时开启NAS的SSH远程访问通过SSH客户端远程连接NAS进入容器创建用户拷贝容器中的数据库相关文件至宿主机在ContainerStation中修改docker-compose文件总结前言 ContainerStation本质上是对Docker可视化的一款软件&…

聊聊分布式锁——Redis和Redisson的方式

一、什么是分布式锁 分布式~~锁&#xff0c;要这么念&#xff0c;首先得是『分布式』&#xff0c;然后才是『锁』 分布式&#xff1a;这里的分布式指的是分布式系统&#xff0c;涉及到好多技术和理论&#xff0c;包括CAP 理论、分布式存储、分布式事务、分布式锁... 分布式系统…

Android开发

前言&#xff1a;因为这学期选了手机APP开发这门课&#xff0c;所以还是写个博客记录一下学习过程&#xff0c;包括安卓开发和ios开发。用到的资料包括课程PPT&#xff0c;和我在网上找的一些视频和资料。 1.Andriod入门 XML&#xff1a;描绘应用界面 &#xff08;决定APP长什…

NeurIPS/ICLR/ICML AI三大会国内高校和企业近年中稿量完整统计

点击文末公众号卡片&#xff0c;找对地方&#xff0c;轻松参会。 近日&#xff0c;有群友转发了一张网图&#xff0c;统计了近年来中国所有单位在NeurIPS、ICLR、ICML论文情况。原图如下&#xff1a; 中稿数100&#xff1a; 清华(1) 北大(2) 占比&#xff1a;22.6%。 累计数…

基于注解管理Bean

一、介绍从 Java 5 开始&#xff0c;Java 增加了对注解&#xff08;Annotation&#xff09;的支持&#xff0c;它是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下&#x…

全板电镀与图形电镀,到底有什么区别?

衔接上文&#xff0c;继续为朋友们分享普通单双面板的生产工艺流程。 如图&#xff0c;第四道主流程为电镀。 电镀的目的为&#xff1a; 适当地加厚孔内与板面的铜厚&#xff0c;使孔金属化&#xff0c;从而实现层间互连。 至于其子流程&#xff0c;可以说是非常简单&#x…

黑马】后台管理176-183

一、新建订单管理的分支二、创建一个订单管理的vue文件进行组件页面的路由配置import Order from ../components/order/Order.vue{path:/orders,component:Order},注意上面的components不要忘记少加一个s&#xff01;三&#xff0c;获取后台数据面包屑导航粘贴过来文本输入框&a…

手写MySQL补充章(十二)SQL语法解析之语法树

目录 模块分析 AST节点类型 SQL词法解析 举个例子 之前写的在第九章写的sql解析太简单了&#xff0c;SQL规范还有复杂的开闭括号以及嵌套查询&#xff0c;复杂SQL几乎不可能通过字符串匹配来实现。 本章以Druid SQL Parser解析SQL为例&#xff0c;进行分析。 模块分析 D…

如何做好需求管理?经验方法、模型、工具

需求管理能力是衡量产品经理能力的一个重要指标。因为需求是产品的基石&#xff0c;只有选取恰当的方法进行需求分析及管理&#xff0c;才能更好的构建产品方案&#xff0c;从而输出精准的产品定义。结合本人学习和自身经验&#xff0c;打算将需求管理分”需求挖掘”、”需求分…

102.第十九章 MySQL数据库 -- MySQL的备份和恢复(十二)

5.备份和恢复 5.1 备份恢复概述 5.1.1 为什么要备份 灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景 参考链接: https://www.toutiao.com/a6939518201961251359/ 5.1.2 备份类型 完全备份,部分备份 完全备份:整个数据集 部分备份:只备份数…

shell的环境变量

一、什么是环境变量 环境变量由系统提前创建的&#xff0c;不仅在Shell编程方面&#xff0c;而且在Linux系统管理方面&#xff0c;都起着非常重要的作用。 打个比方&#xff0c;我们平时所用的编程语言如c语言&#xff0c;我们都会碰到变量的作用域的问题。比如在函数中 定义的…