vuux
Version:
Vue3 Nuxt3 Nuxt4 组件库
140 lines (139 loc) • 3.98 kB
JavaScript
import { ref as v, computed as N, watch as S, onMounted as B } from "vue";
import { Utils as L } from "@vuux/utils";
const T = (e, D, h) => {
const f = v(!1), O = N(() => e.modelValue != "" && e.modelValue != null), k = () => {
e.disabled || (f.value = !f.value);
}, m = v(!1), c = v([]), C = N(() => ({
"app-cascader": !0,
"is-opend": f.value,
"is-disabled": e.disabled ? e.disabled : !1,
"has-content": O.value
})), J = (a) => {
let l = 0;
if (e.fields) {
const d = (t, u) => {
for (let n = 0; n < t.length; n++) {
const i = t[n];
u > l && (l = u), i[e.fields.children] && i[e.fields.children].length > 0 && d(i[e.fields.children], u + 1);
}
};
d(a, 1);
}
return l;
}, x = (a, l) => {
const d = [];
if (e.fields)
for (let t = 0; t < a.length; t++) {
const u = a[t];
d.push({
value: u[e.fields.value],
label: u[e.fields.label],
children: u[e.fields.children] ?? !1,
orginData: u
});
}
return d;
}, r = v(), g = (a, l, d) => {
const t = a[d].data, u = a[d].selectIndex, n = t[u];
n && l.push(n), n && n.children && n.children.length > 0 && g(a, l, d + 1);
}, V = (a, l, d, t = null) => {
c.value[d].selectIndex = l, a.children && a.children.length > 0 && (c.value[d + 1].selectIndex = null, c.value[d + 1].data = x(a.children));
const u = d + 2;
for (let n = u; n < c.value.length; n++)
c.value[n].selectIndex = null, c.value[n].data = [];
if (!a.children || a.children.length === 0) {
const n = [];
g(c.value, n, 0);
const i = n.map((s) => s.label).join(`${e.decollator}`);
if (!e.last)
r.value = i;
else {
const s = n.map((w) => w.label);
r.value = s[s.length - 1];
}
const o = n.map((s) => s.value).join(e.decollator);
if (t === "click" && (e.last ? h("update:modelValue", o.split(e.decollator).at(-1)) : h("update:modelValue", o.split(e.decollator)), f.value = !1), t === "click" && m.value) {
const s = {
display: r.value,
value: o,
label: i,
currentSelect: JSON.parse(JSON.stringify(a.orginData))
};
h("change", s);
}
}
}, M = (a, l) => {
const d = (t, u) => {
const n = [...u, t.value];
if (t.value === l)
return n;
if (t.children)
for (const i of t.children) {
const o = d(i, n);
if (o)
return o;
}
return null;
};
for (const t of a) {
const u = d(t, []);
if (u)
return u;
}
return [];
}, b = () => {
if (e.modelValue) {
let a = e.modelValue;
typeof e.modelValue == "string" && (a = M(e.data, e.modelValue));
for (let l = 0; l < a.length; l++) {
const d = a[l], t = c.value[l].data.findIndex((u) => u.value === d);
if (t == -1)
break;
V(c.value[l].data[t], t, l);
}
}
}, I = () => {
const a = J(e.data);
for (let l = 0; l < a; l++)
l == 0 ? c.value[0] = {
selectIndex: null,
data: x(e.data)
} : c.value[l] = {
selectIndex: null,
data: []
};
b();
}, y = () => {
r.value = "";
const a = JSON.parse(JSON.stringify(c.value));
for (let l = 0; l < a.length; l++)
a[l].selectIndex = null, l !== 0 && (a[l].data = []);
c.value = a, h("update:modelValue", void 0);
};
return L.useClickOutside(D, () => {
e.disabled || (f.value = !1);
}), S(
() => e.data,
() => {
I();
}
), S(
() => e.modelValue,
() => {
e.modelValue === null || e.modelValue === "" ? y() : b();
}
), B(() => {
I(), m.value = !0;
}), {
openState: f,
treeData: c,
classNames: C,
displayValue: r,
handleOpen: k,
handleSelectBar: V,
handleClear: y
};
};
export {
T as useCascader
};