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

相关推荐
青青家的小灰灰15 分钟前
告别 Prop Drilling:Context API 的陷阱、Reducer 模式与原子化状态库原理
前端·javascript·react.js
叶智辽18 分钟前
【Three.js后期处理】如何让你的场景拥有电影级调色
前端·three.js
前端付豪19 分钟前
Nest 项目小实践之前端注册登陆
前端·node.js·nestjs
wuhen_n19 分钟前
Suspense:异步组件加载机制
前端·javascript·vue.js
大雨还洅下20 分钟前
前端JS: ES6新特性
前端
wuhen_n20 分钟前
Teleport:渲染到任意DOM节点
前端·javascript·vue.js
Moment21 分钟前
想要长期陪伴你的助理?先从部署一个 OpenClaw 开始 😍😍😍
前端·后端·github
前端Hardy21 分钟前
别再用 $emit 满天飞了!Vue 3 组件通信的 4 种正确姿势,第 3 种 90% 的人不知道
前端·vue.js·面试
古时的风筝24 分钟前
花10 分钟时间,把终端改造成“生产力武器”:Ghostty + Yazi + Lazygit 配置全流程
前端·后端·程序员
Cache技术分享25 分钟前
340. Java Stream API - 理解并行流的额外开销
前端·后端