vuux
Version:
Vue3 Nuxt3 Nuxt4 组件库
100 lines (99 loc) • 2.76 kB
JavaScript
import { ref as g, onMounted as I } from "vue";
const A = (c, d) => {
const o = g(c.value), s = g([]), f = (e, t = null, l = 0) => {
const n = [];
for (let i = 0; i < e.length; i++) {
const a = e[i], r = {
...a,
isSelect: !1,
isOpen: !1,
isIndeterminate: !1,
parent: t,
level: l,
children: []
};
s.value.push(r), a[c.children]?.length && (r.children = f(a[c.children], r, l + 1)), n.push(r);
}
return n;
}, S = () => {
s.value = [], f(c.data);
}, h = (e) => {
if (!e?.parent)
return;
const t = [], l = e.parent.children ?? [];
for (let a = 0; a < l.length; a++) {
const r = l[a];
r && !r.disabled && t.push(r);
}
const n = t.length ? t.every((a) => a.isSelect) : !1, i = t.length ? t.some((a) => a.isSelect || a.isIndeterminate) : !1;
e.parent.isSelect = n, e.parent.isIndeterminate = !n && i, h(e.parent);
}, v = (e) => {
if (!e)
return;
const t = (n, i) => {
if (!n || i === void 0)
return;
n.isSelect = i, n.isIndeterminate = !1;
const a = n.children ?? [];
for (let r = 0; r < a.length; r++) {
const u = a[r];
u && !u.disabled && t(u, i);
}
};
t(e, e.isSelect), h(e);
const l = [];
for (let n = 0; n < s.value.length; n++) {
const i = s.value[n];
i && i.isSelect && (c.returnParentData || !i.children?.length) && l.push(i[o.value]);
}
d("update:modelValue", l);
}, p = () => {
for (let e = 0; e < s.value.length; e++) {
const t = s.value[e];
t && (t.isSelect = !1, t.isIndeterminate = !1);
}
d("update:modelValue", []);
}, m = (e) => {
if (p(), e && Array.isArray(e) && e.length)
for (let t = 0; t < s.value.length; t++) {
const l = s.value[t];
l && e.includes(l[o.value]) && (l.isSelect = !0, v(l));
}
}, k = (e) => {
for (let t = 0; t < s.value.length; t++)
s.value[t].isOpen = !1;
for (const t of e) {
let l = s.value.find((n) => n[o.value] === t);
for (; l && (l.isOpen = !0, !!l.parent); )
l = l.parent;
}
}, y = () => {
const e = c.modelValue ?? [];
if (e.length)
for (const t of e) {
let l = s.value.find((n) => n[o.value] === t);
for (; l && (l.isOpen = !0, !!l.parent); )
l = l.parent;
}
}, b = () => {
for (let e = 0; e < s.value.length; e++) {
const t = s.value[e];
t.isOpen = !1;
}
};
return I(() => {
S();
}), {
flatTreeData: s,
nodeKey: o,
setSelect: m,
updateSelect: v,
clearAllSelect: p,
expandToSelected: y,
expandByKeys: k,
collapseAll: b
};
};
export {
A as useTree
};