mirror of
				https://github.com/pure-admin/vue-pure-admin.git
				synced 2025-11-03 13:44:47 +08:00 
			
		
		
		
	types: 优化自定义指令的类型提示 (#1161)
This commit is contained in:
		
							parent
							
								
									33a89834d7
								
							
						
					
					
						commit
						a75cf8394e
					
				
							
								
								
									
										1
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							@ -1,6 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
  "recommendations": [
 | 
			
		||||
    "christian-kohler.path-intellisense",
 | 
			
		||||
    "warmthsea.vscode-custom-code-color",
 | 
			
		||||
    "vscode-icons-team.vscode-icons",
 | 
			
		||||
    "davidanson.vscode-markdownlint",
 | 
			
		||||
    "ms-azuretools.vscode-docker",
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							@ -31,11 +31,18 @@
 | 
			
		||||
  "i18n-ally.keystyle": "nested",
 | 
			
		||||
  "i18n-ally.sortKeys": true,
 | 
			
		||||
  "i18n-ally.namespace": true,
 | 
			
		||||
  "i18n-ally.enabledParsers": ["yaml", "js"],
 | 
			
		||||
  "i18n-ally.enabledParsers": [
 | 
			
		||||
    "yaml",
 | 
			
		||||
    "js"
 | 
			
		||||
  ],
 | 
			
		||||
  "i18n-ally.sourceLanguage": "en",
 | 
			
		||||
  "i18n-ally.displayLanguage": "zh-CN",
 | 
			
		||||
  "i18n-ally.enabledFrameworks": ["vue"],
 | 
			
		||||
  "iconify.excludes": ["el"],
 | 
			
		||||
  "i18n-ally.enabledFrameworks": [
 | 
			
		||||
    "vue"
 | 
			
		||||
  ],
 | 
			
		||||
  "iconify.excludes": [
 | 
			
		||||
    "el"
 | 
			
		||||
  ],
 | 
			
		||||
  "vsmqtt.brokerProfiles": [
 | 
			
		||||
    {
 | 
			
		||||
      "name": "broker.emqx.io",
 | 
			
		||||
@ -43,5 +50,14 @@
 | 
			
		||||
      "port": 1883,
 | 
			
		||||
      "clientId": "vsmqtt_client_db34"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
  ],
 | 
			
		||||
  "vscodeCustomCodeColor.highlightValue": [
 | 
			
		||||
    "v-loading",
 | 
			
		||||
    "v-auth",
 | 
			
		||||
    "v-copy",
 | 
			
		||||
    "v-longpress",
 | 
			
		||||
    "v-optimize",
 | 
			
		||||
    "v-ripple"
 | 
			
		||||
  ],
 | 
			
		||||
  "vscodeCustomCodeColor.highlightValueColor": "#b392f0",
 | 
			
		||||
}
 | 
			
		||||
@ -2,7 +2,7 @@ import { hasAuth } from "@/router/utils";
 | 
			
		||||
import type { Directive, DirectiveBinding } from "vue";
 | 
			
		||||
 | 
			
		||||
export const auth: Directive = {
 | 
			
		||||
  mounted(el: HTMLElement, binding: DirectiveBinding) {
 | 
			
		||||
  mounted(el: HTMLElement, binding: DirectiveBinding<string | Array<string>>) {
 | 
			
		||||
    const { value } = binding;
 | 
			
		||||
    if (value) {
 | 
			
		||||
      !hasAuth(value) && el.parentNode?.removeChild(el);
 | 
			
		||||
 | 
			
		||||
@ -3,13 +3,13 @@ import { useEventListener } from "@vueuse/core";
 | 
			
		||||
import { copyTextToClipboard } from "@pureadmin/utils";
 | 
			
		||||
import type { Directive, DirectiveBinding } from "vue";
 | 
			
		||||
 | 
			
		||||
interface CopyEl extends HTMLElement {
 | 
			
		||||
export interface CopyEl extends HTMLElement {
 | 
			
		||||
  copyValue: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 文本复制指令(默认双击复制) */
 | 
			
		||||
export const copy: Directive = {
 | 
			
		||||
  mounted(el: CopyEl, binding: DirectiveBinding) {
 | 
			
		||||
  mounted(el: CopyEl, binding: DirectiveBinding<string>) {
 | 
			
		||||
    const { value } = binding;
 | 
			
		||||
    if (value) {
 | 
			
		||||
      el.copyValue = value;
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ import type { Directive, DirectiveBinding } from "vue";
 | 
			
		||||
import { subBefore, subAfter, isFunction } from "@pureadmin/utils";
 | 
			
		||||
 | 
			
		||||
export const longpress: Directive = {
 | 
			
		||||
  mounted(el: HTMLElement, binding: DirectiveBinding) {
 | 
			
		||||
  mounted(el: HTMLElement, binding: DirectiveBinding<Function>) {
 | 
			
		||||
    const cb = binding.value;
 | 
			
		||||
    if (cb && isFunction(cb)) {
 | 
			
		||||
      let timer = null;
 | 
			
		||||
 | 
			
		||||
@ -8,9 +8,22 @@ import {
 | 
			
		||||
import { useEventListener } from "@vueuse/core";
 | 
			
		||||
import type { Directive, DirectiveBinding } from "vue";
 | 
			
		||||
 | 
			
		||||
export interface OptimizeOptions {
 | 
			
		||||
  /** 事件名 */
 | 
			
		||||
  event: string;
 | 
			
		||||
  /** 事件触发的方法 */
 | 
			
		||||
  fn: (...params: any) => any;
 | 
			
		||||
  /** 是否立即执行 */
 | 
			
		||||
  immediate?: boolean;
 | 
			
		||||
  /** 防抖或节流的延迟时间(防抖默认:`200`毫秒、节流默认:`1000`毫秒) */
 | 
			
		||||
  timeout?: number;
 | 
			
		||||
  /** 传递的参数 */
 | 
			
		||||
  params?: any;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 防抖(v-optimize或v-optimize:debounce)、节流(v-optimize:throttle)指令 */
 | 
			
		||||
export const optimize: Directive = {
 | 
			
		||||
  mounted(el: HTMLElement, binding: DirectiveBinding) {
 | 
			
		||||
  mounted(el: HTMLElement, binding: DirectiveBinding<OptimizeOptions>) {
 | 
			
		||||
    const { value } = binding;
 | 
			
		||||
    const optimizeType = binding.arg ?? "debounce";
 | 
			
		||||
    const type = ["debounce", "throttle"].find(t => t === optimizeType);
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,10 @@ import "./index.scss";
 | 
			
		||||
import { isObject } from "@pureadmin/utils";
 | 
			
		||||
import type { Directive, DirectiveBinding } from "vue";
 | 
			
		||||
 | 
			
		||||
interface RippleOptions {
 | 
			
		||||
export interface RippleOptions {
 | 
			
		||||
  /** 自定义`ripple`颜色,支持`tailwindcss` */
 | 
			
		||||
  class?: string;
 | 
			
		||||
  /** 是否从中心扩散 */
 | 
			
		||||
  center?: boolean;
 | 
			
		||||
  circle?: boolean;
 | 
			
		||||
}
 | 
			
		||||
@ -220,13 +222,6 @@ function updated(el: HTMLElement, binding: RippleDirectiveBinding) {
 | 
			
		||||
  updateRipple(el, binding, wasEnabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description 指令 v-ripple
 | 
			
		||||
 * @use 用法如下
 | 
			
		||||
 * 1. v-ripple 代表启用基本的 ripple 功能
 | 
			
		||||
 * 2. v-ripple="{ class: 'text-red' }" 代表自定义 ripple 颜色,支持 tailwindcss,生效样式是 color
 | 
			
		||||
 * 3. v-ripple.center 代表从中心扩散
 | 
			
		||||
 */
 | 
			
		||||
export const Ripple: Directive = {
 | 
			
		||||
  mounted,
 | 
			
		||||
  unmounted,
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								types/directives.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								types/directives.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
import type { Directive } from "vue";
 | 
			
		||||
import type { CopyEl, OptimizeOptions, RippleOptions } from "@/directives";
 | 
			
		||||
 | 
			
		||||
declare module "vue" {
 | 
			
		||||
  export interface ComponentCustomProperties {
 | 
			
		||||
    /** `Loading` 动画加载指令,具体看:https://element-plus.org/zh-CN/component/loading.html#%E6%8C%87%E4%BB%A4 */
 | 
			
		||||
    vLoading: Directive<Element, boolean>;
 | 
			
		||||
    /** 按钮权限指令 */
 | 
			
		||||
    vAuth: Directive<HTMLElement, string | Array<string>>;
 | 
			
		||||
    /** 文本复制指令(默认双击复制) */
 | 
			
		||||
    vCopy: Directive<CopyEl, string>;
 | 
			
		||||
    /** 长按指令 */
 | 
			
		||||
    vLongpress: Directive<HTMLElement, Function>;
 | 
			
		||||
    /** 防抖、节流指令 */
 | 
			
		||||
    vOptimize: Directive<HTMLElement, OptimizeOptions>;
 | 
			
		||||
    /**
 | 
			
		||||
     * `v-ripple`指令,用法如下:
 | 
			
		||||
     * 1. `v-ripple`代表启用基本的`ripple`功能
 | 
			
		||||
     * 2. `v-ripple="{ class: 'text-red' }"`代表自定义`ripple`颜色,支持`tailwindcss`,生效样式是`color`
 | 
			
		||||
     * 3. `v-ripple.center`代表从中心扩散
 | 
			
		||||
     */
 | 
			
		||||
    vRipple: Directive<HTMLElement, RippleOptions>;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export {};
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user