@dazhicheng/hooks 1.4.35 → 1.4.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -4,3 +4,4 @@ export { usePriorityValue, usePriorityValues, getPriorityValues } from "./usePri
4
4
  export * from "./tools";
5
5
  export { useIsScroll } from "./useIsScroll";
6
6
  export { useDebounceFn } from "./useDebounce";
7
+ export { useElementScreenshot } from "./useElementScreenshot";
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import t,{toType as e}from"vue-types/shim";import{kebabToCamelCase as n,getFirstNonNullOrUndefined as r,debounce as o}from"@dazhicheng/utils";import{getCurrentInstance as c,useSlots as i,useAttrs as s,computed as u,toValue as f,ref as l}from"vue";class a extends t{static get style(){return e("style",{type:[String,Object],default:void 0})}static get VNodeChild(){return e("VNodeChild",{default:void 0})}}function p(t){const e="tt";return{prefixCls:`${e}-${t}`,prefixVar:e}}function d(t,e,o){const f=c(),l=i(),a=s();return u(()=>{const c=f?.vnode?.props||{},i={};for(const[t,e]of Object.entries(c))i[n(t)]=e;const s=void 0===i?.[t]?void 0:e[t];return r(l[t],a[t],s,o?.value?.[t])})}function h(t,e){const n={};return Object.keys(t).forEach(r=>{n[r]=d(r,t,e)}),n}function v(t){const e={};for(const[n,r]of Object.entries(t))e[n]=f(r);return e}function b(t,e){return t in e}function m(t,e=new Map){if(null!==t&&"object"==typeof t){let n=e.get(t);return n||(Array.isArray(t)?(n=[],e.set(t,n),t.forEach((t,r)=>{n[r]=m(t,e)})):(n={},e.set(t,n),Object.keys(t).forEach(r=>{b(r,t)&&(n[r]=m(t[r],e))})),n)}return t}function y(...t){for(const e of t)if(null!=e)return e}function g(t){return t.split("-").filter(Boolean).map((t,e)=>0===e?t:t.charAt(0).toUpperCase()+t.slice(1)).join("")}function j(){const t=l(!1);return{hasScrollbar:t,update:e=>{if(!e.value)return;const n=e.value;t.value=n.scrollHeight>n.clientHeight}}}function C(t,e,n){const r=o(t,e??200,n);return{run:r,cancel:r.cancel,flush:r.flush}}export{m as deepCopy,y as getFirstNonNullOrUndefined,v as getPriorityValues,b as isValidKey,g as kebabToCamelCase,a as propTypes,C as useDebounceFn,p as useDesign,j as useIsScroll,d as usePriorityValue,h as usePriorityValues};
1
+ import t,{toType as e}from"vue-types/shim";import{kebabToCamelCase as n,getFirstNonNullOrUndefined as r,debounce as o}from"@dazhicheng/utils";import{getCurrentInstance as a,useSlots as i,useAttrs as u,computed as c,toValue as s,ref as l,nextTick as f}from"vue";import{toJpeg as d,toPng as p,toBlob as m}from"html-to-image";class w extends t{static get style(){return e("style",{type:[String,Object],default:void 0})}static get VNodeChild(){return e("VNodeChild",{default:void 0})}}function y(t){const e="tt";return{prefixCls:`${e}-${t}`,prefixVar:e}}function h(t,e,o){const s=a(),l=i(),f=u();return c(()=>{const a=s?.vnode?.props||{},i={};for(const[t,e]of Object.entries(a))i[n(t)]=e;const u=void 0===i?.[t]?void 0:e[t];return r(l[t],f[t],u,o?.value?.[t])})}function v(t,e){const n={};return Object.keys(t).forEach(r=>{n[r]=h(r,t,e)}),n}function g(t){const e={};for(const[n,r]of Object.entries(t))e[n]=s(r);return e}function b(t,e){return t in e}function C(t,e=new Map){if(null!==t&&"object"==typeof t){let n=e.get(t);return n||(Array.isArray(t)?(n=[],e.set(t,n),t.forEach((t,r)=>{n[r]=C(t,e)})):(n={},e.set(t,n),Object.keys(t).forEach(r=>{b(r,t)&&(n[r]=C(t[r],e))})),n)}return t}function k(...t){for(const e of t)if(null!=e)return e}function E(t){return t.split("-").filter(Boolean).map((t,e)=>0===e?t:t.charAt(0).toUpperCase()+t.slice(1)).join("")}function j(){const t=l(!1);return{hasScrollbar:t,update:e=>{if(!e.value)return;const n=e.value;t.value=n.scrollHeight>n.clientHeight}}}function F(t,e,n){const r=o(t,e??200,n);return{run:r,cancel:r.cancel,flush:r.flush}}function x(t){const e=s(t);if(!e)throw new Error("Target element not found");return e}function R(t){return{pixelRatio:t?.pixelRatio??Math.min(window.devicePixelRatio||2,3),backgroundColor:t?.backgroundColor??"#ffffff",cacheBust:t?.cacheBust??!0,quality:t?.quality??1,skipFontsReady:t?.skipFontsReady??!1}}async function O(t){t||"undefined"!=typeof document&&"fonts"in document&&await document.fonts.ready}async function A(t=16){await f(),await new Promise(t=>requestAnimationFrame(()=>t())),await new Promise(t=>requestAnimationFrame(()=>t())),t>0&&await new Promise(e=>setTimeout(e,t))}function T(){const t=l(!1),e=l(null);return{captureToBlob:async function(n,r){t.value=!0,e.value=null;try{return await async function(t,e){await A(e?.deferCaptureMs??16),await O(e?.skipFontsReady);const n=x(t),r=await m(n,R(e));if(!r)throw new Error("Failed to generate screenshot blob");return r}(n,r)}catch(t){const n=t instanceof Error?t:new Error(String(t));throw e.value=n,n}finally{t.value=!1}},captureToDataUrl:async function(n,r){t.value=!0,e.value=null;try{const t=r?.format??"png";await A(r?.deferCaptureMs??16),await O(r?.skipFontsReady);const e=x(n);return"jpeg"===t?await d(e,R(r)):await p(e,R(r))}catch(t){const n=t instanceof Error?t:new Error(String(t));throw e.value=n,n}finally{t.value=!1}},isCapturing:t}}export{C as deepCopy,k as getFirstNonNullOrUndefined,g as getPriorityValues,b as isValidKey,E as kebabToCamelCase,w as propTypes,F as useDebounceFn,y as useDesign,T as useElementScreenshot,j as useIsScroll,h as usePriorityValue,v as usePriorityValues};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/propTypes.ts","../src/useDesign.ts","../src/usePriorityValue.ts","../src/tools.ts","../src/useIsScroll.ts","../src/useDebounce.ts"],"sourcesContent":["import type { VueTypeDef } from 'vue-types'\r\nimport VueTypes, { toType } from 'vue-types/shim'\r\n\r\n// export type VueNode = VNodeChild | JSX.Element\r\n\r\nexport class propTypes extends VueTypes {\r\n static get style(): VueTypeDef<any> {\r\n return toType('style', {\r\n type: [String, Object],\r\n default: undefined,\r\n })\r\n }\r\n\r\n static get VNodeChild(): VueTypeDef<any> {\r\n return toType('VNodeChild', {\r\n default: undefined,\r\n })\r\n }\r\n}\r\n","export function useDesign(scope: string) {\r\n const values = {\r\n prefixCls: 'tt',\r\n }\r\n\r\n return {\r\n prefixCls: `${values.prefixCls}-${scope}`,\r\n prefixVar: values.prefixCls,\r\n }\r\n}\r\n","import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue'\r\nimport { getFirstNonNullOrUndefined, kebabToCamelCase } from '@dazhicheng/utils'\r\n\r\nimport { computed, getCurrentInstance, toValue, unref, useAttrs, useSlots } from 'vue'\r\n\r\n/**\r\n * 依次从插槽、attrs、props、state 中获取值\r\n * @param key\r\n * @param props\r\n * @param state\r\n */\r\nfunction usePriorityValue<\r\n T extends Record<string, any>,\r\n S extends Record<string, any>,\r\n K extends keyof T = keyof T,\r\n>(key: K, props: T, state: Readonly<Ref<NoInfer<S>>> | undefined) {\r\n const instance = getCurrentInstance()\r\n const slots = useSlots()\r\n const attrs = useAttrs() as T\r\n\r\n const value = computed((): T[K] => {\r\n // props不管有没有传,都会有默认值,会影响这里的顺序,\r\n // 通过判断原始props是否有值来判断是否传入\r\n const rawProps = (instance?.vnode?.props || {}) as T\r\n\r\n const standardRawProps = {} as T\r\n\r\n for (const [key, value] of Object.entries(rawProps)) {\r\n standardRawProps[kebabToCamelCase(key) as K] = value\r\n }\r\n const propsKey = standardRawProps?.[key] === undefined ? undefined : props[key]\r\n\r\n // slot可以关闭\r\n return getFirstNonNullOrUndefined(\r\n slots[key as string],\r\n attrs[key],\r\n propsKey,\r\n state?.value?.[key as keyof S]\r\n ) as T[K]\r\n })\r\n\r\n return value\r\n}\r\n\r\n/**\r\n * 批量获取state中的值(每个值都是ref)\r\n * @param props\r\n * @param state\r\n */\r\nfunction usePriorityValues<\r\n T extends Record<string, any>,\r\n S extends Ref<Record<string, any>> = Readonly<Ref<NoInfer<T>, NoInfer<T>>>,\r\n>(props: T, state: S | undefined) {\r\n const result: { [K in keyof T]: ComputedRef<T[K]> } = {} as never\r\n\r\n ;(Object.keys(props) as (keyof T)[]).forEach(key => {\r\n result[key] = usePriorityValue(key as keyof typeof props, props, state)\r\n })\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * 批量获取state中的值(集中在一个computed,用于透传)\r\n * @param props\r\n * @param state\r\n */\r\nfunction useForwardPriorityValues<\r\n T extends Record<string, any>,\r\n S extends Ref<Record<string, any>> = Readonly<Ref<NoInfer<T>, NoInfer<T>>>,\r\n>(props: T, state: S | undefined) {\r\n const computedResult: { [K in keyof T]: ComputedRef<T[K]> } = {} as never\r\n\r\n ;(Object.keys(props) as (keyof T)[]).forEach(key => {\r\n computedResult[key] = usePriorityValue(key as keyof typeof props, props, state)\r\n })\r\n\r\n return computed(() => {\r\n const unwrapResult: Record<string, any> = {}\r\n Object.keys(props).forEach(key => {\r\n unwrapResult[key] = unref(computedResult[key])\r\n })\r\n return unwrapResult as { [K in keyof T]: T[K] }\r\n })\r\n}\r\n\r\n/**\r\n * 将包含ComputedRef的对象转换为普通值对象\r\n * @param props - 包含ComputedRef的响应式对象\r\n * @returns 解包后的普通对象,所有值都是原始值而非响应式引用\r\n */\r\nfunction getPriorityValues<\r\n T extends Record<string, MaybeRefOrGetter<any>>,\r\n S extends {\r\n [K in keyof T]: T[K] extends MaybeRefOrGetter<infer U> ? U : T[K]\r\n },\r\n>(props: T): S {\r\n // 创建解包后的对象类型\r\n const standardProps: S = {} as never\r\n\r\n // 遍历props对象的每个键值对\r\n for (const [key, value] of Object.entries(props)) {\r\n // 使用toValue解包计算属性值,并赋值给新对象\r\n standardProps[key as keyof T] = toValue(value)\r\n }\r\n\r\n return standardProps\r\n}\r\n\r\nexport { getPriorityValues, useForwardPriorityValues, usePriorityValue, usePriorityValues }\r\n","/**\r\n * 判断对象中是否包含该属性\r\n * @param key 键\r\n * @param object 对象\r\n * @returns 是否包含\r\n */\r\nexport function isValidKey(\r\n key: string | number | symbol,\r\n object: object\r\n): key is keyof typeof object {\r\n return key in object\r\n}\r\n\r\n/**\r\n * 深拷贝\r\n * 兼容函数,对象,相互引用场景\r\n * @param target 需要深拷贝的原对象\r\n * @return 深拷贝后的对象\r\n */\r\nexport function deepCopy<T>(target: T, map = new Map()) {\r\n if (target !== null && typeof target === 'object') {\r\n let res = map.get(target)\r\n if (res) return res\r\n if (Array.isArray(target)) {\r\n res = []\r\n map.set(target, res)\r\n target.forEach((item, index) => {\r\n res[index] = deepCopy(item, map)\r\n })\r\n } else {\r\n res = {}\r\n map.set(target, res)\r\n Object.keys(target).forEach(key => {\r\n if (isValidKey(key, target)) res[key] = deepCopy(target[key], map)\r\n })\r\n }\r\n return res\r\n }\r\n return target\r\n}\r\n\r\n\r\n/**\r\n * 获取第一个非 null 和非 undefined 的值\r\n * @description 从传入的多个值中返回第一个既不是 null 也不是 undefined 的值\r\n * @template T 返回值类型\r\n * @param args 要检查的值数组\r\n * @returns 第一个非 null 和非 undefined 的值,如果都是 null 或 undefined 则返回 undefined\r\n *\r\n * @example\r\n * getFirstNonNullOrUndefined(null, undefined, 1, 2) // 返回 1\r\n * getFirstNonNullOrUndefined(null, undefined) // 返回 undefined\r\n * getFirstNonNullOrUndefined('', null, 'test') // 返回 ''\r\n */\r\nexport function getFirstNonNullOrUndefined(...args: any[]): any {\r\n for (const value of args) {\r\n if (value !== undefined && value !== null) {\r\n return value\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\n\r\n/**\r\n * 将短横线命名转换为驼峰命名\r\n * @description 将形如 'my-component-name' 的短横线命名法转换为 'myComponentName' 的驼峰命名法\r\n * @param str 要转换的短横线命名字符串\r\n * @returns 转换后的驼峰命名字符串\r\n *\r\n * @example\r\n * kebabToCamelCase('my-component') // 返回 'myComponent'\r\n * kebabToCamelCase('my--component') // 返回 'myComponent'\r\n * kebabToCamelCase('-my-component-') // 返回 'myComponent'\r\n */\r\nexport function kebabToCamelCase(str: string): string {\r\n return str\r\n .split('-')\r\n .filter(Boolean)\r\n .map((word, index) => (index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)))\r\n .join('')\r\n}","import type { Ref } from 'vue'\r\nimport { ref } from 'vue'\r\n\r\nexport function useIsScroll(): {\r\n hasScrollbar: Ref<boolean>\r\n update: (elementRef: Ref<HTMLDivElement>) => void\r\n} {\r\n const hasScrollbar = ref(false)\r\n\r\n const update = (elementRef: Ref<HTMLDivElement>): void => {\r\n if (!elementRef.value) return\r\n const element = elementRef.value\r\n hasScrollbar.value = element.scrollHeight > element.clientHeight\r\n }\r\n\r\n return { hasScrollbar, update }\r\n}\r\n","import { debounce } from \"@dazhicheng/utils\";\r\nexport type DebounceSettings = {\r\n /**\r\n * 前沿触发\r\n */\r\n leading?: boolean | undefined;\r\n /**\r\n * 最大等待时间\r\n */\r\n maxWait?: number | undefined;\r\n /**\r\n * 尾部触发\r\n */\r\n trailing?: boolean | undefined;\r\n};\r\ntype noop = (...args: unknown[]) => unknown;\r\n\r\n/**\r\n * 防抖函数 Hook 返回类型\r\n */\r\ntype UseDebounceFnReturn<T extends noop> = {\r\n /**\r\n * 防抖函数,保持原函数的完整签名\r\n */\r\n run: (...args: Parameters<T>) => ReturnType<T>;\r\n /**\r\n * 取消防抖\r\n */\r\n cancel: () => void;\r\n /**\r\n * 立即执行防抖函数,保持原函数的完整签名\r\n */\r\n flush: (...args: Parameters<T>) => ReturnType<T>;\r\n};\r\n\r\n/**\r\n * 防抖函数 Hook\r\n * @param fn 要防抖的函数\r\n * @param wait 延迟时间(毫秒)默认200\r\n * @param options 防抖选项\r\n * @returns 返回防抖后的函数和相关控制方法\r\n */\r\nexport function useDebounceFn<T extends noop>(\r\n fn: T,\r\n wait?: number,\r\n options?: DebounceSettings,\r\n): UseDebounceFnReturn<T> {\r\n const debounced = debounce(fn, wait ?? 200, options);\r\n return {\r\n /**\r\n * 防抖函数,保持原函数的返回类型\r\n * 如果原函数是异步的,返回 Promise;如果是同步的,返回原始类型\r\n */\r\n run: debounced as unknown as (...args: Parameters<T>) => ReturnType<T>,\r\n\r\n /**\r\n * 取消防抖\r\n */\r\n cancel: debounced.cancel,\r\n\r\n /**\r\n * 立即执行防抖函数,保持原函数的返回类型\r\n */\r\n flush: debounced.flush as unknown as (...args: Parameters<T>) => ReturnType<T>,\r\n };\r\n}\r\n"],"names":["propTypes","VueTypes","style","toType","type","String","Object","default","undefined","VNodeChild","useDesign","scope","values","prefixCls","prefixVar","usePriorityValue","key","props","state","instance","getCurrentInstance","slots","useSlots","attrs","useAttrs","computed","rawProps","vnode","standardRawProps","value","entries","kebabToCamelCase","propsKey","getFirstNonNullOrUndefined","usePriorityValues","result","keys","forEach","getPriorityValues","standardProps","toValue","isValidKey","object","deepCopy","target","map","Map","res","get","Array","isArray","set","item","index","args","str","split","filter","Boolean","word","charAt","toUpperCase","slice","join","useIsScroll","hasScrollbar","ref","update","elementRef","element","scrollHeight","clientHeight","useDebounceFn","fn","wait","options","debounced","debounce","run","cancel","flush"],"mappings":"uPAKM,MAAOA,UAAkBC,EAC7B,gBAAWC,GACT,OAAOC,EAAO,QAAS,CACrBC,KAAM,CAACC,OAAQC,QACfC,aAASC,GAEb,CAEA,qBAAWC,GACT,OAAON,EAAO,aAAc,CAC1BI,aAASC,GAEb,ECjBI,SAAUE,EAAUC,GACxB,MAAMC,EACO,KAGb,MAAO,CACLC,UAAW,GAAGD,KAAoBD,IAClCG,UAAWF,EAEf,CCEA,SAASG,EAIPC,EAAQC,EAAUC,GAClB,MAAMC,EAAWC,IACXC,EAAQC,IACRC,EAAQC,IAuBd,OArBcC,EAAS,KAGrB,MAAMC,EAAYP,GAAUQ,OAAOV,OAAS,CAAA,EAEtCW,EAAmB,CAAA,EAEzB,IAAK,MAAOZ,EAAKa,KAAUvB,OAAOwB,QAAQJ,GACxCE,EAAiBG,EAAiBf,IAAaa,EAEjD,MAAMG,OAAuCxB,IAA5BoB,IAAmBZ,QAAqBR,EAAYS,EAAMD,GAG3E,OAAOiB,EACLZ,EAAML,GACNO,EAAMP,GACNgB,EACAd,GAAOW,QAAQb,KAKrB,CAOA,SAASkB,EAGPjB,EAAUC,GACV,MAAMiB,EAAgD,CAAA,EAMtD,OAJE7B,OAAO8B,KAAKnB,GAAuBoB,QAAQrB,IAC3CmB,EAAOnB,GAAOD,EAAiBC,EAA2BC,EAAOC,KAG5DiB,CACT,CA+BA,SAASG,EAKPrB,GAEA,MAAMsB,EAAmB,CAAA,EAGzB,IAAK,MAAOvB,EAAKa,KAAUvB,OAAOwB,QAAQb,GAExCsB,EAAcvB,GAAkBwB,EAAQX,GAG1C,OAAOU,CACT,CCrGM,SAAUE,EACdzB,EACA0B,GAEA,OAAO1B,KAAO0B,CAChB,CAQM,SAAUC,EAAYC,EAAWC,EAAM,IAAIC,KAC/C,GAAe,OAAXF,GAAqC,iBAAXA,EAAqB,CACjD,IAAIG,EAAMF,EAAIG,IAAIJ,GAClB,OAAIG,IACAE,MAAMC,QAAQN,IAChBG,EAAM,GACNF,EAAIM,IAAIP,EAAQG,GAChBH,EAAOP,QAAQ,CAACe,EAAMC,KACpBN,EAAIM,GAASV,EAASS,EAAMP,OAG9BE,EAAM,CAAA,EACNF,EAAIM,IAAIP,EAAQG,GAChBzC,OAAO8B,KAAKQ,GAAQP,QAAQrB,IACtByB,EAAWzB,EAAK4B,KAASG,EAAI/B,GAAO2B,EAASC,EAAO5B,GAAM6B,OAG3DE,EACT,CACA,OAAOH,CACT,CAeM,SAAUX,KAA8BqB,GAC5C,IAAK,MAAMzB,KAASyB,EAClB,GAAIzB,QACF,OAAOA,CAIb,CAcM,SAAUE,EAAiBwB,GAC/B,OAAOA,EACJC,MAAM,KACNC,OAAOC,SACPb,IAAI,CAACc,EAAMN,IAAqB,IAAVA,EAAcM,EAAOA,EAAKC,OAAO,GAAGC,cAAgBF,EAAKG,MAAM,IACrFC,KAAK,GACV,UC9EgBC,IAId,MAAMC,EAAeC,GAAI,GAQzB,MAAO,CAAED,eAAcE,OANPC,IACd,IAAKA,EAAWvC,MAAO,OACvB,MAAMwC,EAAUD,EAAWvC,MAC3BoC,EAAapC,MAAQwC,EAAQC,aAAeD,EAAQE,cAIxD,UC0BgBC,EACdC,EACAC,EACAC,GAEA,MAAMC,EAAYC,EAASJ,EAAIC,GAAQ,IAAKC,GAC5C,MAAO,CAKLG,IAAKF,EAKLG,OAAQH,EAAUG,OAKlBC,MAAOJ,EAAUI,MAErB"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/propTypes.ts","../src/useDesign.ts","../src/usePriorityValue.ts","../src/tools.ts","../src/useIsScroll.ts","../src/useDebounce.ts","../src/useElementScreenshot.ts"],"sourcesContent":["import type { VueTypeDef } from 'vue-types'\r\nimport VueTypes, { toType } from 'vue-types/shim'\r\n\r\n// export type VueNode = VNodeChild | JSX.Element\r\n\r\nexport class propTypes extends VueTypes {\r\n static get style(): VueTypeDef<any> {\r\n return toType('style', {\r\n type: [String, Object],\r\n default: undefined,\r\n })\r\n }\r\n\r\n static get VNodeChild(): VueTypeDef<any> {\r\n return toType('VNodeChild', {\r\n default: undefined,\r\n })\r\n }\r\n}\r\n","export function useDesign(scope: string) {\r\n const values = {\r\n prefixCls: 'tt',\r\n }\r\n\r\n return {\r\n prefixCls: `${values.prefixCls}-${scope}`,\r\n prefixVar: values.prefixCls,\r\n }\r\n}\r\n","import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue'\r\nimport { getFirstNonNullOrUndefined, kebabToCamelCase } from '@dazhicheng/utils'\r\n\r\nimport { computed, getCurrentInstance, toValue, unref, useAttrs, useSlots } from 'vue'\r\n\r\n/**\r\n * 依次从插槽、attrs、props、state 中获取值\r\n * @param key\r\n * @param props\r\n * @param state\r\n */\r\nfunction usePriorityValue<\r\n T extends Record<string, any>,\r\n S extends Record<string, any>,\r\n K extends keyof T = keyof T,\r\n>(key: K, props: T, state: Readonly<Ref<NoInfer<S>>> | undefined) {\r\n const instance = getCurrentInstance()\r\n const slots = useSlots()\r\n const attrs = useAttrs() as T\r\n\r\n const value = computed((): T[K] => {\r\n // props不管有没有传,都会有默认值,会影响这里的顺序,\r\n // 通过判断原始props是否有值来判断是否传入\r\n const rawProps = (instance?.vnode?.props || {}) as T\r\n\r\n const standardRawProps = {} as T\r\n\r\n for (const [key, value] of Object.entries(rawProps)) {\r\n standardRawProps[kebabToCamelCase(key) as K] = value\r\n }\r\n const propsKey = standardRawProps?.[key] === undefined ? undefined : props[key]\r\n\r\n // slot可以关闭\r\n return getFirstNonNullOrUndefined(\r\n slots[key as string],\r\n attrs[key],\r\n propsKey,\r\n state?.value?.[key as keyof S]\r\n ) as T[K]\r\n })\r\n\r\n return value\r\n}\r\n\r\n/**\r\n * 批量获取state中的值(每个值都是ref)\r\n * @param props\r\n * @param state\r\n */\r\nfunction usePriorityValues<\r\n T extends Record<string, any>,\r\n S extends Ref<Record<string, any>> = Readonly<Ref<NoInfer<T>, NoInfer<T>>>,\r\n>(props: T, state: S | undefined) {\r\n const result: { [K in keyof T]: ComputedRef<T[K]> } = {} as never\r\n\r\n ;(Object.keys(props) as (keyof T)[]).forEach(key => {\r\n result[key] = usePriorityValue(key as keyof typeof props, props, state)\r\n })\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * 批量获取state中的值(集中在一个computed,用于透传)\r\n * @param props\r\n * @param state\r\n */\r\nfunction useForwardPriorityValues<\r\n T extends Record<string, any>,\r\n S extends Ref<Record<string, any>> = Readonly<Ref<NoInfer<T>, NoInfer<T>>>,\r\n>(props: T, state: S | undefined) {\r\n const computedResult: { [K in keyof T]: ComputedRef<T[K]> } = {} as never\r\n\r\n ;(Object.keys(props) as (keyof T)[]).forEach(key => {\r\n computedResult[key] = usePriorityValue(key as keyof typeof props, props, state)\r\n })\r\n\r\n return computed(() => {\r\n const unwrapResult: Record<string, any> = {}\r\n Object.keys(props).forEach(key => {\r\n unwrapResult[key] = unref(computedResult[key])\r\n })\r\n return unwrapResult as { [K in keyof T]: T[K] }\r\n })\r\n}\r\n\r\n/**\r\n * 将包含ComputedRef的对象转换为普通值对象\r\n * @param props - 包含ComputedRef的响应式对象\r\n * @returns 解包后的普通对象,所有值都是原始值而非响应式引用\r\n */\r\nfunction getPriorityValues<\r\n T extends Record<string, MaybeRefOrGetter<any>>,\r\n S extends {\r\n [K in keyof T]: T[K] extends MaybeRefOrGetter<infer U> ? U : T[K]\r\n },\r\n>(props: T): S {\r\n // 创建解包后的对象类型\r\n const standardProps: S = {} as never\r\n\r\n // 遍历props对象的每个键值对\r\n for (const [key, value] of Object.entries(props)) {\r\n // 使用toValue解包计算属性值,并赋值给新对象\r\n standardProps[key as keyof T] = toValue(value)\r\n }\r\n\r\n return standardProps\r\n}\r\n\r\nexport { getPriorityValues, useForwardPriorityValues, usePriorityValue, usePriorityValues }\r\n","/**\r\n * 判断对象中是否包含该属性\r\n * @param key 键\r\n * @param object 对象\r\n * @returns 是否包含\r\n */\r\nexport function isValidKey(\r\n key: string | number | symbol,\r\n object: object\r\n): key is keyof typeof object {\r\n return key in object\r\n}\r\n\r\n/**\r\n * 深拷贝\r\n * 兼容函数,对象,相互引用场景\r\n * @param target 需要深拷贝的原对象\r\n * @return 深拷贝后的对象\r\n */\r\nexport function deepCopy<T>(target: T, map = new Map()) {\r\n if (target !== null && typeof target === 'object') {\r\n let res = map.get(target)\r\n if (res) return res\r\n if (Array.isArray(target)) {\r\n res = []\r\n map.set(target, res)\r\n target.forEach((item, index) => {\r\n res[index] = deepCopy(item, map)\r\n })\r\n } else {\r\n res = {}\r\n map.set(target, res)\r\n Object.keys(target).forEach(key => {\r\n if (isValidKey(key, target)) res[key] = deepCopy(target[key], map)\r\n })\r\n }\r\n return res\r\n }\r\n return target\r\n}\r\n\r\n\r\n/**\r\n * 获取第一个非 null 和非 undefined 的值\r\n * @description 从传入的多个值中返回第一个既不是 null 也不是 undefined 的值\r\n * @template T 返回值类型\r\n * @param args 要检查的值数组\r\n * @returns 第一个非 null 和非 undefined 的值,如果都是 null 或 undefined 则返回 undefined\r\n *\r\n * @example\r\n * getFirstNonNullOrUndefined(null, undefined, 1, 2) // 返回 1\r\n * getFirstNonNullOrUndefined(null, undefined) // 返回 undefined\r\n * getFirstNonNullOrUndefined('', null, 'test') // 返回 ''\r\n */\r\nexport function getFirstNonNullOrUndefined(...args: any[]): any {\r\n for (const value of args) {\r\n if (value !== undefined && value !== null) {\r\n return value\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\n\r\n/**\r\n * 将短横线命名转换为驼峰命名\r\n * @description 将形如 'my-component-name' 的短横线命名法转换为 'myComponentName' 的驼峰命名法\r\n * @param str 要转换的短横线命名字符串\r\n * @returns 转换后的驼峰命名字符串\r\n *\r\n * @example\r\n * kebabToCamelCase('my-component') // 返回 'myComponent'\r\n * kebabToCamelCase('my--component') // 返回 'myComponent'\r\n * kebabToCamelCase('-my-component-') // 返回 'myComponent'\r\n */\r\nexport function kebabToCamelCase(str: string): string {\r\n return str\r\n .split('-')\r\n .filter(Boolean)\r\n .map((word, index) => (index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)))\r\n .join('')\r\n}","import type { Ref } from 'vue'\r\nimport { ref } from 'vue'\r\n\r\nexport function useIsScroll(): {\r\n hasScrollbar: Ref<boolean>\r\n update: (elementRef: Ref<HTMLDivElement>) => void\r\n} {\r\n const hasScrollbar = ref(false)\r\n\r\n const update = (elementRef: Ref<HTMLDivElement>): void => {\r\n if (!elementRef.value) return\r\n const element = elementRef.value\r\n hasScrollbar.value = element.scrollHeight > element.clientHeight\r\n }\r\n\r\n return { hasScrollbar, update }\r\n}\r\n","import { debounce } from \"@dazhicheng/utils\";\r\nexport type DebounceSettings = {\r\n /**\r\n * 前沿触发\r\n */\r\n leading?: boolean | undefined;\r\n /**\r\n * 最大等待时间\r\n */\r\n maxWait?: number | undefined;\r\n /**\r\n * 尾部触发\r\n */\r\n trailing?: boolean | undefined;\r\n};\r\ntype noop = (...args: unknown[]) => unknown;\r\n\r\n/**\r\n * 防抖函数 Hook 返回类型\r\n */\r\ntype UseDebounceFnReturn<T extends noop> = {\r\n /**\r\n * 防抖函数,保持原函数的完整签名\r\n */\r\n run: (...args: Parameters<T>) => ReturnType<T>;\r\n /**\r\n * 取消防抖\r\n */\r\n cancel: () => void;\r\n /**\r\n * 立即执行防抖函数,保持原函数的完整签名\r\n */\r\n flush: (...args: Parameters<T>) => ReturnType<T>;\r\n};\r\n\r\n/**\r\n * 防抖函数 Hook\r\n * @param fn 要防抖的函数\r\n * @param wait 延迟时间(毫秒)默认200\r\n * @param options 防抖选项\r\n * @returns 返回防抖后的函数和相关控制方法\r\n */\r\nexport function useDebounceFn<T extends noop>(\r\n fn: T,\r\n wait?: number,\r\n options?: DebounceSettings,\r\n): UseDebounceFnReturn<T> {\r\n const debounced = debounce(fn, wait ?? 200, options);\r\n return {\r\n /**\r\n * 防抖函数,保持原函数的返回类型\r\n * 如果原函数是异步的,返回 Promise;如果是同步的,返回原始类型\r\n */\r\n run: debounced as unknown as (...args: Parameters<T>) => ReturnType<T>,\r\n\r\n /**\r\n * 取消防抖\r\n */\r\n cancel: debounced.cancel,\r\n\r\n /**\r\n * 立即执行防抖函数,保持原函数的返回类型\r\n */\r\n flush: debounced.flush as unknown as (...args: Parameters<T>) => ReturnType<T>,\r\n };\r\n}\r\n","import type { MaybeRefOrGetter } from \"vue\";\r\nimport { nextTick, ref, toValue } from \"vue\";\r\nimport { toBlob, toPng as htmlToPng, toJpeg as htmlToJpeg } from \"html-to-image\";\r\ntype ScreenshotTarget = HTMLElement | null | undefined;\r\ntype CaptureFormat = \"png\" | \"jpeg\";\r\n/**\r\n * 截图配置项\r\n */\r\nexport interface ElementScreenshotOptions {\r\n /**\r\n * 输出格式\r\n * 默认 png\r\n */\r\n format?: CaptureFormat;\r\n\r\n /**\r\n * jpeg 输出质量\r\n * 取值范围 0 到 1\r\n * 默认 1\r\n */\r\n quality?: number;\r\n\r\n /**\r\n * 渲染像素比\r\n * 默认 min(devicePixelRatio, 3)\r\n */\r\n pixelRatio?: number;\r\n\r\n /**\r\n * 背景色\r\n * 默认 #ffffff\r\n */\r\n backgroundColor?: string;\r\n\r\n /**\r\n * 资源防缓存参数\r\n * 默认 true\r\n */\r\n cacheBust?: boolean;\r\n\r\n /**\r\n * 是否跳过 document.fonts.ready\r\n * 默认 false\r\n */\r\n skipFontsReady?: boolean;\r\n\r\n /**\r\n * 截图前额外延迟毫秒数\r\n * 用于保证 loading 先渲染\r\n * 默认 16\r\n */\r\n deferCaptureMs?: number;\r\n}\r\n\r\n/**\r\n * 解析截图目标元素\r\n * @param target 截图目标元素或其 ref 或 getter\r\n * @returns 可用的 HTMLElement\r\n */\r\nfunction resolveTarget(target: MaybeRefOrGetter<ScreenshotTarget>): HTMLElement {\r\n const node = toValue(target);\r\n if (!node) {\r\n throw new Error(\"Target element not found\");\r\n }\r\n return node;\r\n}\r\n\r\n/**\r\n * 构建 html-to-image 渲染参数\r\n * @param options 截图配置项\r\n * @returns 渲染参数对象\r\n */\r\nfunction getRenderOptions(options?: ElementScreenshotOptions) {\r\n return {\r\n pixelRatio: options?.pixelRatio ?? Math.min(window.devicePixelRatio || 2, 3),\r\n backgroundColor: options?.backgroundColor ?? \"#ffffff\",\r\n cacheBust: options?.cacheBust ?? true,\r\n quality: options?.quality ?? 1,\r\n skipFontsReady: options?.skipFontsReady ?? false,\r\n };\r\n}\r\n\r\n/**\r\n * 截图前等待字体加载完成\r\n * @param skipFontsReady 是否跳过字体等待\r\n */\r\nasync function ensureFontsReady(skipFontsReady?: boolean) {\r\n if (skipFontsReady) return;\r\n if (typeof document === \"undefined\" || !(\"fonts\" in document)) return;\r\n await document.fonts.ready;\r\n}\r\n\r\n/**\r\n * 让出一帧\r\n * 确保 loading 先渲染\r\n */\r\nasync function waitPaintFrame(deferCaptureMs = 16) {\r\n await nextTick();\r\n await new Promise<void>(resolve => requestAnimationFrame(() => resolve()));\r\n await new Promise<void>(resolve => requestAnimationFrame(() => resolve()));\r\n if (deferCaptureMs > 0) {\r\n await new Promise<void>(resolve => setTimeout(resolve, deferCaptureMs));\r\n }\r\n}\r\n\r\n/**\r\n * DOM 截图 Hook\r\n * @returns 截图方法与状态\r\n */\r\nexport function useElementScreenshot() {\r\n const isCapturing = ref(false);\r\n const lastError = ref<Error | null>(null);\r\n\r\n /**\r\n * 清空最近一次错误\r\n */\r\n // function resetError() {\r\n // lastError.value = null;\r\n // }\r\n\r\n /**\r\n * 渲染目标元素并输出基础 Blob\r\n * @param target 截图目标元素或其 ref 或 getter\r\n * @param options 截图配置项\r\n * @returns 截图 Blob\r\n */\r\n async function renderToBaseBlob(\r\n target: MaybeRefOrGetter<ScreenshotTarget>,\r\n options?: ElementScreenshotOptions,\r\n ): Promise<Blob> {\r\n await waitPaintFrame(options?.deferCaptureMs ?? 16);\r\n await ensureFontsReady(options?.skipFontsReady);\r\n const node = resolveTarget(target);\r\n const blob = await toBlob(node, getRenderOptions(options));\r\n if (!blob) {\r\n throw new Error(\"Failed to generate screenshot blob\");\r\n }\r\n return blob;\r\n }\r\n\r\n /**\r\n * 导出 Blob\r\n * @param target 截图目标元素或其 ref 或 getter\r\n * @param options 截图配置项\r\n * @returns 截图 Blob\r\n */\r\n async function captureToBlob(\r\n target: MaybeRefOrGetter<ScreenshotTarget>,\r\n options?: ElementScreenshotOptions,\r\n ): Promise<Blob> {\r\n isCapturing.value = true;\r\n lastError.value = null;\r\n try {\r\n return await renderToBaseBlob(target, options);\r\n } catch (error) {\r\n const finalError = error instanceof Error ? error : new Error(String(error));\r\n lastError.value = finalError;\r\n throw finalError;\r\n } finally {\r\n isCapturing.value = false;\r\n }\r\n }\r\n\r\n /**\r\n * 导出 DataURL\r\n * @param target 截图目标元素或其 ref 或 getter\r\n * @param options 截图配置项\r\n * @returns 截图 DataURL\r\n */\r\n async function captureToDataUrl(\r\n target: MaybeRefOrGetter<ScreenshotTarget>,\r\n options?: ElementScreenshotOptions,\r\n ): Promise<string> {\r\n isCapturing.value = true;\r\n lastError.value = null;\r\n try {\r\n const format = options?.format ?? \"png\";\r\n await waitPaintFrame(options?.deferCaptureMs ?? 16);\r\n await ensureFontsReady(options?.skipFontsReady);\r\n const node = resolveTarget(target);\r\n if (format === \"jpeg\") {\r\n return await htmlToJpeg(node, getRenderOptions(options));\r\n }\r\n return await htmlToPng(node, getRenderOptions(options));\r\n } catch (error) {\r\n const finalError = error instanceof Error ? error : new Error(String(error));\r\n lastError.value = finalError;\r\n throw finalError;\r\n } finally {\r\n isCapturing.value = false;\r\n }\r\n }\r\n\r\n return {\r\n captureToBlob,\r\n captureToDataUrl,\r\n isCapturing,\r\n };\r\n}\r\n"],"names":["propTypes","VueTypes","style","toType","type","String","Object","default","undefined","VNodeChild","useDesign","scope","values","prefixCls","prefixVar","usePriorityValue","key","props","state","instance","getCurrentInstance","slots","useSlots","attrs","useAttrs","computed","rawProps","vnode","standardRawProps","value","entries","kebabToCamelCase","propsKey","getFirstNonNullOrUndefined","usePriorityValues","result","keys","forEach","getPriorityValues","standardProps","toValue","isValidKey","object","deepCopy","target","map","Map","res","get","Array","isArray","set","item","index","args","str","split","filter","Boolean","word","charAt","toUpperCase","slice","join","useIsScroll","hasScrollbar","ref","update","elementRef","element","scrollHeight","clientHeight","useDebounceFn","fn","wait","options","debounced","debounce","run","cancel","flush","resolveTarget","node","Error","getRenderOptions","pixelRatio","Math","min","window","devicePixelRatio","backgroundColor","cacheBust","quality","skipFontsReady","async","ensureFontsReady","document","fonts","ready","waitPaintFrame","deferCaptureMs","nextTick","Promise","resolve","requestAnimationFrame","setTimeout","useElementScreenshot","isCapturing","lastError","captureToBlob","blob","toBlob","renderToBaseBlob","error","finalError","captureToDataUrl","format","htmlToJpeg","htmlToPng"],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { MaybeRefOrGetter } from "vue";
2
+ type ScreenshotTarget = HTMLElement | null | undefined;
3
+ type CaptureFormat = "png" | "jpeg";
4
+ /**
5
+ * 截图配置项
6
+ */
7
+ export interface ElementScreenshotOptions {
8
+ /**
9
+ * 输出格式
10
+ * 默认 png
11
+ */
12
+ format?: CaptureFormat;
13
+ /**
14
+ * jpeg 输出质量
15
+ * 取值范围 0 到 1
16
+ * 默认 1
17
+ */
18
+ quality?: number;
19
+ /**
20
+ * 渲染像素比
21
+ * 默认 min(devicePixelRatio, 3)
22
+ */
23
+ pixelRatio?: number;
24
+ /**
25
+ * 背景色
26
+ * 默认 #ffffff
27
+ */
28
+ backgroundColor?: string;
29
+ /**
30
+ * 资源防缓存参数
31
+ * 默认 true
32
+ */
33
+ cacheBust?: boolean;
34
+ /**
35
+ * 是否跳过 document.fonts.ready
36
+ * 默认 false
37
+ */
38
+ skipFontsReady?: boolean;
39
+ /**
40
+ * 截图前额外延迟毫秒数
41
+ * 用于保证 loading 先渲染
42
+ * 默认 16
43
+ */
44
+ deferCaptureMs?: number;
45
+ }
46
+ /**
47
+ * DOM 截图 Hook
48
+ * @returns 截图方法与状态
49
+ */
50
+ export declare function useElementScreenshot(): {
51
+ captureToBlob: (target: MaybeRefOrGetter<ScreenshotTarget>, options?: ElementScreenshotOptions) => Promise<Blob>;
52
+ captureToDataUrl: (target: MaybeRefOrGetter<ScreenshotTarget>, options?: ElementScreenshotOptions) => Promise<string>;
53
+ isCapturing: import("vue").Ref<boolean, boolean>;
54
+ };
55
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dazhicheng/hooks",
3
- "version": "1.4.35",
3
+ "version": "1.4.37",
4
4
  "description": "",
5
5
  "main": "./dist/index.esm.js",
6
6
  "module": "./dist/index.esm.js",
@@ -23,7 +23,8 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "vue-types": "^5.1.2",
26
- "@dazhicheng/utils": "1.3.35"
26
+ "html-to-image": "^1.11.13",
27
+ "@dazhicheng/utils": "1.3.36"
27
28
  },
28
29
  "peerDependencies": {
29
30
  "element-plus": "^2.7.0"