UNPKG

wdy_custom_hooks

Version:

one custom hooks of vue3

337 lines (336 loc) 9.84 kB
const h = /* @__PURE__ */ new WeakMap(); function L(t, e, n = 200) { T(t); let s = null, a = t.offsetWidth, i = t.offsetHeight; const o = new ResizeObserver((r) => { const c = r[0], { width: u, height: l } = c.contentRect; u === a && l === i || (a = u, i = l, s && clearTimeout(s), s = window.setTimeout(() => { e(c.contentRect), s = null; }, n)); }); o.observe(t), h.set(t, { observer: o, debounceTimer: s, lastWidth: a, lastHeight: i }); } function T(t) { const e = h.get(t); e && (e.debounceTimer && clearTimeout(e.debounceTimer), e.observer.disconnect(), h.delete(t)); } const $ = (t) => { t.directive("resize", { mounted(e, n) { const s = n.arg ? parseInt(n.arg) : 200; L(e, n.value, s); }, beforeUnmount(e) { T(e); } }); }; L.install = $; function x(t) { if (t.tagName.toLowerCase() === "input") t.focus(); else { const e = t.querySelector("input"); e && e.focus(); } } const F = (t) => { t.directive("focus", { mounted(e) { x(e); } }); }; x.install = F; const p = /* @__PURE__ */ new WeakMap(); async function W(t, e, n) { if (!t) { n == null || n("The copy content cannot be empty."); return; } try { await navigator.clipboard.writeText(t), e && typeof e == "function" ? e == null || e() : console.log("复制成功"); } catch (s) { n && typeof n == "function" ? n == null || n(s) : console.error("Failed to copy text: ", s); } } const N = (t) => { t.directive("copy", { mounted(e, n) { const { text: s, success: a, error: i } = n.value, o = () => { W(s, a, i); }; e.addEventListener("click", o), p.set(e, o); }, beforeUnmount(e) { const n = p.get(e); n && (e.removeEventListener("click", n), p.delete(e)); } }); }; W.install = N; const v = /* @__PURE__ */ new WeakMap(); async function C(t, e, n) { const s = t.scrollHeight, a = t.offsetHeight, i = t.scrollTop; s - a - i <= n && await e(); } const A = (t) => { t.directive("scrollLoad", { mounted(e, n) { const { loadMoreFn: s, distance: a = 100 } = n.value, i = () => { C(e, s, a); }; e.addEventListener("scroll", i), v.set(e, i); }, beforeUnmount(e) { const n = v.get(e); n && (e.removeEventListener("scroll", n), v.delete(e)); } }); }; C.install = A; function S(t, e, n, s) { const a = t instanceof HTMLImageElement ? t : t.querySelector("img"); if (!a) { console.warn("未找到 img 元素"); return; } n && (a.src = n), new IntersectionObserver((o, r) => { o.forEach((c) => { c.isIntersecting && (a.src = e, a.onload = () => { }, a.onerror = () => { s && (a.src = s), console.error("图片加载失败:", e); }, r.unobserve(t)); }); }).observe(t); } const D = (t) => { t.directive("lazyLoad", { mounted(e, n) { const { src: s, placeholderSrc: a, errorSrc: i } = n.value; S(e, s, a, i); } }); }; S.install = D; const g = /* @__PURE__ */ new WeakMap(); function z(t, e, n) { if (typeof e != "function") throw new Error("v-longpress 指令的值必须是一个函数"); let s = null; const a = n || 2e3, i = (c) => { s === null && (s = window.setTimeout(() => { e(c); }, a)); }, o = () => { s !== null && (clearTimeout(s), s = null); }; t.addEventListener("mousedown", i), t.addEventListener("touchstart", i), t.addEventListener("mouseup", o), t.addEventListener("mouseleave", o), t.addEventListener("touchend", o), t.addEventListener("touchcancel", o); const r = () => { t.removeEventListener("mousedown", i), t.removeEventListener("touchstart", i), t.removeEventListener("mouseup", o), t.removeEventListener("mouseleave", o), t.removeEventListener("touchend", o), t.removeEventListener("touchcancel", o); }; g.set(t, r); } const q = (t) => { t.directive("longPress", { mounted(e, n) { const { time: s, callback: a } = n.value; z(e, a, s); }, beforeMount(e) { const n = g.get(e); n && (n(), g.delete(e)); } }); }; z.install = q; const f = /* @__PURE__ */ new WeakMap(), y = /* @__PURE__ */ new WeakMap(), k = /* @__PURE__ */ new WeakMap(); function I(t, e, n, s, a, i) { if (!e) { console.warn("v-watermark 指令需要传入水印文本"); return; } const o = document.createElement("div"); o.style.position = "absolute", o.style.top = "0", o.style.left = "0", o.style.width = "100%", o.style.height = "100%", o.style.pointerEvents = "none", o.style.backgroundImage = `url(${B( e, n, s, a, i )})`, o.style.backgroundRepeat = "repeat", o.style.zIndex = "9999", t.style.position = "relative", t.appendChild(o), f.set(t, o), k.set(o, o.getAttribute("style") || ""); } function B(t, e, n, s, a) { const i = document.createElement("canvas"), o = i.getContext("2d"); if (!o) throw new Error("无法创建 canvas 上下文"); o.font = e; const c = o.measureText(t).width, u = parseInt(e, 10), l = s * Math.PI / 180, U = Math.abs(c * Math.cos(l)) + Math.abs(u * Math.sin(l)), O = Math.abs(c * Math.sin(l)) + Math.abs(u * Math.cos(l)), E = a; return i.width = U + E, i.height = O + E, o.font = e, o.fillStyle = n, o.textAlign = "center", o.textBaseline = "middle", o.translate(i.width / 2, i.height / 2), o.rotate(l), o.fillText(t, 0, 0), i.toDataURL("image/png"); } function G(t, e) { const n = { attributes: !0, attributeFilter: ["style"], // 只监听 style 属性的变化 attributeOldValue: !0 // 记录旧值 }, s = function(i) { for (const o of i) if (o.type === "attributes" && o.attributeName === "style") { const r = e.getAttribute("style") || "", c = k.get(e) || ""; r !== c && (a.disconnect(), e.setAttribute("style", c), a.observe(e, n)); } }, a = new MutationObserver(s); a.observe(e, n), y.set(t, a); } const Y = (t) => { t.directive("waterMarker", { mounted(e, n) { const { text: s, font: a = "16px Microsoft Yahei", color: i = "rgba(0, 0, 0, 0.1)", rotate: o = -20, labelGap: r = 50 } = n.value; I(e, s, a, i, o, r); const c = f.get(e); c && G(e, c); }, unmounted(e) { const n = f.get(e); n && (e.removeChild(n), f.delete(e), k.delete(n)); const s = y.get(e); s && (s.disconnect(), y.delete(e)); } }); }; I.install = Y; const m = /* @__PURE__ */ new WeakMap(); function H(t, e, n) { t === e.target || t.contains(e.target) || n(e); } const j = (t) => { t.directive("outsideClick", { mounted(e, n) { const s = (a) => { H(e, a, n.value); }; document.addEventListener("click", s), m.set(e, s); }, beforeUnmount(e) { const n = m.get(e); n && (e.removeEventListener("click", n), m.delete(e)); } }); }; H.install = j; const b = /* @__PURE__ */ new WeakMap(); function R(t, e, n = "click", s = 300) { if (typeof e != "function") { console.warn("v-debounce expects a function as the value"); return; } if (!["click", "dblclick", "mousedown", "mouseup", "mousemove", "keydown", "keyup", "keypress", "input", "change"].includes(n)) { console.warn("v-debounce expects a valid event type as the argument"); return; } let i; const o = () => { i && clearTimeout(i), i = setTimeout(() => { e(); }, s); }; t.addEventListener(n, o), b.set(t, o); } const J = (t) => { t.directive("debounce", { mounted(e, n) { const { value: s, arg: a = "click" } = n, { callback: i, delay: o = 300 } = s; R(e, i, a, o); }, beforeMount(e) { const n = b.get(e); n && (n(), b.delete(e)); } }); }; R.install = J; const w = /* @__PURE__ */ new WeakMap(); function P(t, e, n = "click", s = 300) { if (typeof e != "function") { console.warn("v-throttle expects a function as the value"); return; } if (!["click", "dblclick", "mousedown", "mouseup", "mousemove", "keydown", "keyup", "keypress", "input", "change"].includes(n)) { console.warn("v-throttle expects a valid event type as the argument"); return; } let i = 0; const o = () => { const r = Date.now(); r - i >= s && (e(), i = r); }; t.addEventListener(n, o), w.set(t, () => { t.removeEventListener(n, o); }); } const K = (t) => { t.directive("throttle", { mounted(e, n) { const { value: s, arg: a = "click" } = n, { callback: i, delay: o = 300 } = s; P(e, i, a, o); }, beforeUnmount(e) { const n = w.get(e); n && (n(), w.delete(e)); } }); }; P.install = K; const d = /* @__PURE__ */ new WeakMap(); function M(t, e) { return t ? e ? e.includes(t) : (console.error("user permission list is required"), !1) : (console.error("Must provide a permission value"), !1); } const Q = (t) => { t.directive("permission", { mounted(e, n) { const { value: s, arg: a } = n; if (console.log(a, s), !s) throw new Error("must provide a permission array"); d.set(e, { parent: e.parentNode, nextSibling: e.nextSibling }), M(a, s) || e.parentNode && e.parentNode.removeChild(e); }, updated(e, n) { const { value: s, arg: a } = n; if (!s) throw new Error("must provide a permission array"); const { parent: i, nextSibling: o } = d.get(e); M(a, s) ? i.contains(e) || (o ? i.insertBefore(e, o) : i.appendChild(e)) : i.contains(e) && i.removeChild(e); }, beforeUnmount(e) { d.get(e) && d.delete(e); } }); }; M.install = Q; export { W as useCopy, R as useDebounce, x as useFocus, S as useImgLazy, z as useLongPress, H as useOutsideClick, M as usePermission, L as useResize, C as useSrcollLoad, P as useThrottle, I as useWaterMarker };