如何编写智能提示的vue自定义指令

摘要

本文将简单介绍一个vue的自定义指令的开发流程,引入本文关键"全局注册自定义指令 ",并提供自动补充类型提示

背景

当前版本有需要通过平台控制项目功能开关的需求,为了提高维护效率以及后期开发的效率,我首先想到了用vue自定义指令来做这件事情,但是开发的全局指令没有提示很头痛,想做到v-show这种指令有提示,于是探索得到了这些收获,大概想达到的效果就是如下gif。

目的

通过使用开发的自定义脚本,提高开发效率,开发体验,减少维护成本。通过自动补全维护单一数据源,避免key写错。

对比

传统方式

通过v-if或者v-show加上一个ref变量来控制组件的显示隐藏,这种方法效率太低,代码太杂乱。

HTML 复制代码
<template>
    <button v-if="show">这是一个可能显示隐藏的开关</button>
</template>
<script setup lang="ts">
const show=ref(false)
onMounted(()=>{
    show.value=fetch()
})
<script/>

自定义指令方式

通过全局定义的自定义指令,配合ide和typescript的自动补全,开发效率🚀。

HTML 复制代码
<button v-toggle="toggleKey">这是一个可能显示隐藏的开关</button>

自定义指令全流程

定义自定义指令

typescript 复制代码
// src/directives/vToggle.ts
import { Directive, Plugin } from "vue";

type ToggleKey = '_test_switch' | 'ceshi '
export type vToggleType = Directive<HTMLElement, ToggleKey>
const VTogglePlugin: Plugin = {
  install(app) {
    const directive: vToggleType = {
      mounted: (el, binding) => {
        const key = binding.value;
        const isShow = fetch(key) //这部分自行发挥,可以外层包裹map来查询。
        if (isShow) {
          return
        } {
          const parentEl = el.parentElement
          parentEl?.removeChild(el)
        }
      }
    }
    app.directive('toggle', directive);
  }
}
export default VTogglePlugin

项目注册自定义指令

typescript 复制代码
// src/main.ts
import { createApp } from "vue"
import App from "./App.vue"
import { router } from "./routes"
import VToggle from "src/directive/v-toggle"

const app = createApp(App)
app.use(router)
app.use(VToggle)
app.mount("#app")

ts类型注册 重要‼️

在src下写一个d.ts文件来申明vue模块中的ComponentCustomProperties存在一个属性名为vToggle的属性,并且为它标注上ts类型。

typescript 复制代码
// src/directives.d.ts
import { vToggleType } from 'src/directive/v-toggle'

declare module 'vue' {
  export interface ComponentCustomProperties {
    vToggle: vToggleType
  }
}

export {}

结论

本文简单介绍了一个vue自定义指令的开发,主要是想科普如何让一个自定义指令获得typescript的支持和ide的自动补全。不仅仅自定义指令可以,全局组件也是类似的操作。

相关推荐
野生yumeko1 小时前
伪静态WordPress/Vue
前端·javascript·vue.js
爱因斯坦乐1 小时前
【vue】I18N国际化管理系统
前端·javascript·vue.js·笔记·前端框架
一只游鱼1 小时前
vue集成dplayer
前端·javascript·vue.js·播放器·dplayer
技术钱8 小时前
vue3 封装图片上传预览组件支持docx、excel、pdf、图片、txt格式
vue.js·pdf·excel
kyle~8 小时前
C++--- override 关键字 强制编译器验证当前函数是否重写基类的虚函数
java·前端·c++
Light608 小时前
像素退场,曲线登场:现代响应式 CSS 全家桶 | 领码课堂
前端·css·响应式设计·css函数·布局系统·相对单位·设计令牌
爱生活的苏苏9 小时前
elementUI 表单验证-联动型校验
前端·javascript·elementui
一只小风华~10 小时前
Vue Router 路由元信息(meta)详解
前端·javascript·vue.js
*且听风吟11 小时前
html 实现鼠标滑动点亮横轴
前端·javascript·html
计算机学姐11 小时前
基于微信小程序的垃圾分类管理系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis