From 64b812802f5ca053c8f0ae9c9f159cbfedb32d5d Mon Sep 17 00:00:00 2001 From: invalid w Date: Thu, 28 Sep 2023 11:05:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=A4=9A=E9=87=8D=E6=B0=B4=E5=8D=B0=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B8=85=E9=99=A4=E6=89=80=E6=9C=89=E6=B0=B4=E5=8D=B0=E6=96=B9?= =?UTF-8?q?=E6=B3=95.=20close=20#2610=20(#3084)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * perf(watermark): 消除水印hook类型问题 * feat: 支持设置多重水印,增加清除所有水印方法 * chore: 应该让用户自己来进行水印清除 --- src/hooks/web/useWatermark.ts | 39 ++++++++++++++++--------- src/views/demo/feat/watermark/index.vue | 33 ++++++++++----------- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/hooks/web/useWatermark.ts b/src/hooks/web/useWatermark.ts index 5840c149e..8674a2503 100644 --- a/src/hooks/web/useWatermark.ts +++ b/src/hooks/web/useWatermark.ts @@ -3,15 +3,24 @@ import { useRafThrottle } from '/@/utils/domUtils'; import { addResizeListener, removeResizeListener } from '/@/utils/event'; import { isDef } from '/@/utils/is'; -const domSymbol = Symbol('watermark-dom'); -const sourceMap = new WeakMap(); +const watermarkSymbol = 'watermark-dom'; + +type UseWatermarkRes = { + setWatermark: (str: string) => void; + clear: () => void; + clearAll: () => void; +}; + +const sourceMap = new Map>(); export function useWatermark( appendEl: Ref = ref(document.body) as Ref, -) { +): UseWatermarkRes { + const domSymbol = Symbol(watermarkSymbol); const appendElRaw = unref(appendEl); - if (appendElRaw && sourceMap.has(appendElRaw)) { - return sourceMap.get(appendElRaw); + if (appendElRaw && sourceMap.has(domSymbol)) { + const { setWatermark, clear } = sourceMap.get(domSymbol) as UseWatermarkRes; + return { setWatermark, clear, clearAll }; } const func = useRafThrottle(function () { const el = unref(appendEl); @@ -19,13 +28,13 @@ export function useWatermark( const { clientHeight: height, clientWidth: width } = el; updateWatermark({ height, width }); }); - const id = domSymbol.toString(); const watermarkEl = shallowRef(); const clear = () => { const domId = unref(watermarkEl); watermarkEl.value = undefined; const el = unref(appendEl); + sourceMap.delete(domSymbol); if (!el) return; domId && el.removeChild(domId); removeResizeListener(el, func); @@ -70,25 +79,23 @@ export function useWatermark( } const createWatermark = (str: string) => { - if (unref(watermarkEl)) { + if (unref(watermarkEl) && sourceMap.has(domSymbol)) { updateWatermark({ str }); - return id; + return; } const div = document.createElement('div'); watermarkEl.value = div; - div.id = id; div.style.pointerEvents = 'none'; div.style.top = '0px'; div.style.left = '0px'; div.style.position = 'absolute'; div.style.zIndex = '100000'; const el = unref(appendEl); - if (!el) return id; + if (!el) return; const { clientHeight: height, clientWidth: width } = el; updateWatermark({ str, width, height }); el.appendChild(div); - sourceMap.set(el, { setWatermark, clear }); - return id; + sourceMap.set(domSymbol, { setWatermark, clear }); }; function setWatermark(str: string) { @@ -102,5 +109,11 @@ export function useWatermark( } } - return { setWatermark, clear }; + return { setWatermark, clear, clearAll }; +} + +function clearAll() { + Array.from(sourceMap.values()).forEach((item) => { + item.clear(); + }); } diff --git a/src/views/demo/feat/watermark/index.vue b/src/views/demo/feat/watermark/index.vue index ac44a5d13..055d83685 100644 --- a/src/views/demo/feat/watermark/index.vue +++ b/src/views/demo/feat/watermark/index.vue @@ -1,33 +1,30 @@ -