如何编写智能提示的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的自动补全。不仅仅自定义指令可以,全局组件也是类似的操作。

相关推荐
若初&7 分钟前
文件上传Ⅲ
前端·web安全
若愚67928 分钟前
前端取经路——前端安全:构建坚不可摧的Web应用防线
前端·安全
邪恶的贝利亚12 分钟前
定时器设计
java·linux·前端
工业互联网专业13 分钟前
基于springboot+vue的机场乘客服务系统
java·vue.js·spring boot·毕业设计·源码·课程设计·机场乘客服务系统
inksci32 分钟前
Vue 3 打开 el-dialog 时使 el-input 获取焦点
前端·javascript·vue.js
若愚67921 小时前
前端取经路——量子UI:响应式交互新范式
前端·ui·交互
PHASELESS4111 小时前
HTML常用标签用法全解析:构建语义化网页的核心指南
前端·html
粉末的沉淀2 小时前
css:倒影倾斜效果
前端·css
zandy10112 小时前
如何快速入门-衡石科技分析平台
服务器·前端·科技·数据库管理员