wdy_custom_hooks
Version:
one custom hooks of vue3
337 lines (336 loc) • 9.84 kB
JavaScript
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
};