首页 > 其他分享 >vue3 实现自定义指令封装 --- 通俗易懂

vue3 实现自定义指令封装 --- 通俗易懂

时间:2024-06-04 15:29:00浏览次数:12  
标签:el 自定义 app focus --- 指令 vue3 mounted

1、局部自定义指令

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

<template>
  <div>
    <h3>使用自定义指令</h3>
    <div>########################## start 局部自定义指令</div>
    <div>
        我是一个input:
        <input type="text" v-myFocus />
    </div>
    <div>########################## end 局部自定义指令</div>

  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'
/**
 * 1、局部自定义指令, 在模板中启用 v-focus
 *    在<script setup>定义组件内的指令,任何以v开头的驼峰式命名的变量都可以被用作一个自定义指令
 *  为了区分下面全局自定义指令 v-focus,这里全局改为v-MyFocus
 */
// const vFocus = {
//     mounted: (el) => el.focus()
// }
const vMyFocus = {
    mounted: (el) => el.focus()
}
</script>

效果:

1.2  如果是vue3的options api, 自定义指令需要在directives选项中注册 

<template>
  <input v-focus />
</template>
<script>
export default{
  setup() {},
  directives: {
    // 指令名
    focus: {
      // 生命周期
      mounted(el) {
        // 处理DOM的逻辑
        el.focus()
      },
    }
  }
}
</script>

 效果:

2、全局自定义指令 

2.1 创建文件:  src/directives/focus.js

export default function(app) {
    app.directive('focus', {
        mounted(el) {
            console.log('focus指令, mounted')
            el.focus()
        },
    })
}

2.2 创建文件: src/directives/index.js

import registerFocus from './focus'     // 获取焦点

export default function registerDirectives(app) {
    registerFocus(app)
}

2.3 main.js中引入

import registerDirectives from './directives/index'

const app = createApp(App)
registerDirectives(app)

报警告如下:

index.vue:9 [Vue warn]: Failed to resolve directive: focus 
  at <Index onVnodeUnmounted=fn<onVnodeUnmounted> ref=Ref< undefined > > 
  at <RouterView> 
  at <App>

2.4 页面内使用

    <div>########################## start 全局自定义指令</div>
    <div>
        我是一个使用全局自定义指令的input:
        <input type="password" v-focus />
    </div>
    <div>########################## end 全局自定义指令</div>

效果:

3、 常用的自定义指令(后面有新的全局自定义指令封装会更新)

3.1 input获取焦点

src/directives/focus.js 

export default function(app) {
    app.directive('focus', {
        mounted(el) {
            console.log('focus指令, mounted')
            el.focus()
        },
    })
}

ts写法:

// 获取焦点
export default function(app: any) {
app.directive("focus", {
    mounted(el: any) {
      console.log("focus mounted");
      el.focus();
    }
  })
}

3.2 防抖

src/directives/debounce.js

注册那一步和上面focus一样(此处及后面将省略)

// 防抖
export default function (app) {
    app.directive('debounce', {
        mounted(el, binding) {
            console.log('el', el, 'binding', binding);
            let timer
            el.addEventListener('click', () => {
                if (timer) clearTimeout(timer)
                timer = setTimeout(() => {
                    binding.value()
                }, 2000)
            })
        },
    })
}

ts写法:

// 防抖
export default function(app: any) {
  app.directive("debounce", {
    mounted(el: any, binding: any) {
      let timer:any
      el.addEventListener('click', () => {
        if (timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(() => {
          binding.value()
        }, 1000)
      })
    }
  })
}

使用:

<template>
    <div>
        我是测试防抖的全局自定义指令,
        如果在该间隔内再次触发,则重新计时。
        <button class="btn" v-debounce="testDebounceBtn" >防抖按钮:点击我,2秒后执行一次</button>
    </div>
</template>

<script setup>
 /**
  * 3、防抖自定义指令 --- 全局
  */
const testDebounceBtn = () => {
    console.log('防抖按钮:点击我,2秒内只执行一次')
}
</script>

效果:

点击按钮后2秒后执行,2秒内再次触发点击,将重新计时,重新计时后2秒后才执行。(正常开发时,时间按照实际情况设定,一般设定1秒后执行)

 

标签:el,自定义,app,focus,---,指令,vue3,mounted
From: https://blog.csdn.net/weixin_48420104/article/details/139441856

相关文章

  • P5663 [CSP-J2019] 加工零件
    原题链接题解请仔细读题!!!如果1号工人需要提供原材料,那么代表\(a_i\to1\)存在一条长度为\(L_i\)的路径(可以重复走)由于重复走不会改变路径长度的奇偶性,所以一定存在一条奇偶性相同,且长度小于\(L_i\)的路径,所以只要求从点1出发到各个点奇偶最短路即可code#include<bits/......
  • QNX-19—QNX绑核优先级-1-理论
    一、Threadaffinity翻译翻译:QNXSoftwareDevelopmentPlatform-->Programming-->Programmer'sGuide-->MulticoreProcessing-->Theimpactofmulticorehttps://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.prog/topic/multico......
  • 基于mac-vlan的网络准入控制方案
    网络拓扑图如下:SW1配置vlan1020304000#创建vlaninterfaceGigabitEthernet1/0/1#进入接口portlink-typehybrid#接口模式设为hybridporthybridvlan1020304000untagged#vlan1020304000数据包没有tagporthybridpvidvla......
  • NCHU-软件学院-232019班-23201125-罗伊鑫-第二次Blog
    前言本次Blog总结三次题目集的7-1题目的知识点、题量、难度等情况,以及写完后的错误总结和自我思考。1.知识点三次题目集都对于类的设计的提前规划好有着必要的需求,还有就是对于继承与多态的合理的使用。接着就是对于正则表达式的使用的检测,然后就是要有清晰的逻辑编程表达。2.......
  • 2024-05-14影视排行榜
    1、《种地吧第二季》2、《我的阿勒泰》3、《哈哈哈哈哈第四季》4、《幕府将军》5、《辐射》6、《惜花芷》7、《微暗之火》8、《金手指》9、《乘风2024》10、《歌手2024》(被大家说成五旬老太守国门。。。)11、《与凤行》12、《女高推理班第三季》13、《庆余年......
  • CLIP(Contrastive Language-Image Pre-training)
    CLIP(ContrastiveLanguage-ImagePre-training)是一种多模态预训练神经网络模型,由OpenAI在2021年初发布469。CLIP的核心创新在于其能够将图像和文本映射到一个共享的向量空间中,使得模型能够理解图像和文本之间的语义关系1。CLIP模型的架构非常简洁,但在zero-shot文本-图像检索、z......
  • 51单片机学习记录-06-LED点阵屏(74HC595移位寄存器)
    1 74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。2 74HC595原理图上升沿移位SERCLK,上升沿锁存RCLK点阵屏MATRIX函数sbitRCK=P3^5; //RCLKsbitSCK=P3^6; //SRCLKsbitSER=P3......
  • 宝塔面板部署ruoyi-admin_jar(java项目)
    1.创建文件夹,上传jar文件:/www/wwwroot/域名/ruoyi-admin_jar2.点击网站-》添加Java项目3.选择已上传的jar文件-》添加对应域名-》配置后端路径:/prov-api,配置前端路径:/www/wwwroot/域名/dist(其他的默认)4.点击确认,等待一下,尝试访问(报错:404前端路径不对,502端口配置不对,401后端api......
  • 每日两道练习题-- 带你学会SQL server(获取所有非manager员工当前的薪水情况,对所有员工
    SQLServer在实际场景中的应用非常广泛,以下是一些主要的应用领域:企业级应用:SQLServer具有高度的稳定性、可靠性和安全性,非常适合用于企业级应用。例如,企业资源规划(ERP)系统、客户关系管理(CRM)系统、人力资源管理(HRM)系统等,这些系统都需要处理大量的数据和复杂的业务逻辑,SQLS......
  • View->Canvas使用RectF方式绘制Bitmap,RectF大小和Bitmap大小不同导致绘制效果不同
    图片XML文件<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent......