@ctsy/layui-vue
Version:
a component library for Vue 3 base on layui-vue
128 lines (127 loc) • 4.88 kB
JavaScript
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
import { defineComponent, useSlots, inject, computed, ref, watch, onBeforeUnmount, openBlock, createElementBlock, createElementVNode, unref, renderSlot, createCommentVNode, normalizeClass, createBlock, withCtx } from "vue";
import { o as onClickOutside } from "../index4.js";
import "../transition/index.js";
import { _ as _sfc_main$1 } from "../index2.js";
import "../plugin-vue_export-helper.js";
const _hoisted_1 = { class: "layui-nav-item" };
const _hoisted_2 = { key: 0 };
const _hoisted_3 = { class: "layui-nav-child" };
const __default__ = {
name: "LaySubMenu"
};
const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({}, __default__), {
props: {
id: null,
title: null
},
setup(__props) {
const props = __props;
const slots = useSlots();
const isTree = inject("isTree");
inject("selectedKey");
const openKeys = inject("openKeys");
const isCollapse = inject("isCollapse");
const isCollapseTransition = inject("isCollapseTransition");
const isOpen = computed(() => {
return openKeys.value.includes(props.id);
});
const subMenuRef = ref();
const position = ref();
watch(isOpen, () => {
if (isOpen.value && position.value !== "left-nav") {
setTimeout(setPosition, 0);
}
});
const openHandle = function() {
if (!isCollapse.value) {
if (openKeys.value.includes(props.id)) {
openKeys.value.splice(openKeys.value.indexOf(props.id), 1);
} else {
openKeys.value.push(props.id);
}
}
};
const setPosition = function() {
if (!isTree.value || !subMenuRef.value) {
return;
}
const offsetWidth = subMenuRef.value.offsetWidth;
if (window.innerWidth < subMenuRef.value.getBoundingClientRect().left + offsetWidth + 10) {
position.value = "left-nav";
} else {
position.value = "";
}
};
onClickOutside(subMenuRef, (event) => {
if (!isTree.value) {
let index = openKeys.value.indexOf(props.id);
if (index != -1) {
openKeys.value.splice(index, 1);
}
}
});
window.addEventListener("resize", setPosition);
onBeforeUnmount(() => window.removeEventListener("resize", setPosition));
return (_ctx, _cache) => {
return openBlock(), createElementBlock("li", _hoisted_1, [
createElementVNode("a", {
href: "javascript:void(0)",
onClick: _cache[0] || (_cache[0] = ($event) => openHandle())
}, [
createElementVNode("i", null, [
unref(slots).icon ? renderSlot(_ctx.$slots, "icon", { key: 0 }) : createCommentVNode("", true)
]),
createElementVNode("span", null, [
unref(slots).title ? renderSlot(_ctx.$slots, "title", { key: 0 }) : createCommentVNode("", true)
]),
createElementVNode("i", {
class: normalizeClass([[unref(isOpen) && !unref(isTree) ? "layui-nav-mored" : ""], "layui-icon layui-icon-down layui-nav-more"])
}, null, 2)
]),
unref(isTree) ? (openBlock(), createBlock(unref(_sfc_main$1), {
key: 0,
enable: unref(isCollapseTransition)
}, {
default: withCtx(() => [
unref(isOpen) ? (openBlock(), createElementBlock("div", _hoisted_2, [
createElementVNode("dl", _hoisted_3, [
renderSlot(_ctx.$slots, "default")
])
])) : createCommentVNode("", true)
]),
_: 3
}, 8, ["enable"])) : (openBlock(), createElementBlock("dl", {
key: 1,
ref_key: "subMenuRef",
ref: subMenuRef,
class: normalizeClass(["layui-nav-child layui-anim layui-anim-upbit", [{ "layui-show": unref(isOpen) }, position.value]])
}, [
renderSlot(_ctx.$slots, "default")
], 2))
]);
};
}
}));
_sfc_main.install = (app) => {
app.component(_sfc_main.name, _sfc_main);
};
export { _sfc_main as default };