2022-01-31 23:23:20 +00:00
|
|
|
<script lang="ts">
|
|
|
|
export default {
|
2022-02-16 09:22:55 +00:00
|
|
|
name: "LayMenu",
|
|
|
|
};
|
2022-01-31 23:23:20 +00:00
|
|
|
</script>
|
2021-09-29 15:42:53 +00:00
|
|
|
|
2022-01-31 23:23:20 +00:00
|
|
|
<script setup lang="ts">
|
2022-02-27 04:55:09 +00:00
|
|
|
import { computed, provide, ref, watch } from "vue";
|
2022-01-28 03:43:48 +00:00
|
|
|
import "./index.less";
|
2021-11-18 07:23:24 +00:00
|
|
|
|
|
|
|
export interface LayMenuProps {
|
|
|
|
selectedKey?: string;
|
|
|
|
openKeys?: string[];
|
|
|
|
tree?: boolean;
|
2022-01-29 16:04:36 +00:00
|
|
|
theme?: string;
|
2022-02-07 06:09:09 +00:00
|
|
|
inverted?: boolean | string;
|
|
|
|
level?: boolean | string;
|
2022-02-25 02:17:12 +00:00
|
|
|
collapse?: boolean | string;
|
2022-03-24 14:37:05 +00:00
|
|
|
collapseTransition?: boolean | string;
|
2021-11-18 07:23:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const emit = defineEmits(["update:selectedKey", "update:openKeys"]);
|
|
|
|
|
|
|
|
const props = withDefaults(defineProps<LayMenuProps>(), {
|
|
|
|
selectedKey: "",
|
|
|
|
openKeys: () => [],
|
|
|
|
tree: false,
|
2022-02-16 09:22:55 +00:00
|
|
|
theme: "dark",
|
2022-01-30 13:50:38 +00:00
|
|
|
inverted: false,
|
2022-02-16 09:22:55 +00:00
|
|
|
level: false,
|
2022-02-25 02:17:12 +00:00
|
|
|
collapse: false,
|
2022-03-24 14:37:41 +00:00
|
|
|
collapseTransition: true,
|
2021-11-18 07:23:24 +00:00
|
|
|
});
|
|
|
|
|
2022-02-27 04:55:09 +00:00
|
|
|
let oldOpenKeys = ref<string[]>([]);
|
|
|
|
|
2021-11-18 07:23:24 +00:00
|
|
|
const isTree = computed(() => props.tree);
|
2022-02-27 04:55:09 +00:00
|
|
|
const isCollapse = computed(() => props.collapse);
|
2022-03-24 14:37:05 +00:00
|
|
|
const isCollapseTransition = computed(() => props.collapseTransition);
|
2021-10-06 11:09:03 +00:00
|
|
|
|
2021-10-18 08:43:49 +00:00
|
|
|
const openKeys = computed({
|
|
|
|
get() {
|
2021-11-18 07:23:24 +00:00
|
|
|
return props.openKeys;
|
2021-10-18 08:43:49 +00:00
|
|
|
},
|
|
|
|
set(val) {
|
2022-02-27 04:55:09 +00:00
|
|
|
emit("update:openKeys", val);
|
2021-10-18 08:43:49 +00:00
|
|
|
},
|
2021-11-18 07:23:24 +00:00
|
|
|
});
|
2021-10-16 17:18:42 +00:00
|
|
|
|
2021-10-18 08:43:49 +00:00
|
|
|
const selectedKey = computed({
|
|
|
|
get() {
|
2021-11-18 07:23:24 +00:00
|
|
|
return props.selectedKey;
|
2021-10-18 08:43:49 +00:00
|
|
|
},
|
|
|
|
set(val) {
|
2021-11-18 07:23:24 +00:00
|
|
|
emit("update:selectedKey", val);
|
2021-10-18 08:43:49 +00:00
|
|
|
},
|
2021-11-18 07:23:24 +00:00
|
|
|
});
|
2021-10-16 17:18:42 +00:00
|
|
|
|
2022-02-27 04:55:09 +00:00
|
|
|
watch(
|
|
|
|
() => props.collapse,
|
|
|
|
() => {
|
|
|
|
if (props.collapse) {
|
|
|
|
// 删除所有打开
|
|
|
|
oldOpenKeys.value = props.openKeys;
|
|
|
|
emit("update:openKeys", []);
|
|
|
|
} else {
|
|
|
|
// 赋值所有打开
|
|
|
|
emit("update:openKeys", oldOpenKeys.value);
|
|
|
|
}
|
2022-02-27 09:47:14 +00:00
|
|
|
},
|
|
|
|
{ immediate: true }
|
2022-02-27 04:55:09 +00:00
|
|
|
);
|
|
|
|
|
2021-11-18 07:23:24 +00:00
|
|
|
provide("isTree", isTree);
|
|
|
|
provide("selectedKey", selectedKey);
|
|
|
|
provide("openKeys", openKeys);
|
2022-02-27 04:55:09 +00:00
|
|
|
provide("isCollapse", isCollapse);
|
2022-03-24 14:37:05 +00:00
|
|
|
provide("isCollapseTransition", isCollapseTransition);
|
2021-09-29 15:42:53 +00:00
|
|
|
</script>
|
2022-01-31 23:23:20 +00:00
|
|
|
|
|
|
|
<template>
|
2022-02-16 09:22:55 +00:00
|
|
|
<ul
|
|
|
|
class="layui-nav"
|
|
|
|
:class="[
|
|
|
|
level ? 'level' : '',
|
|
|
|
inverted ? 'inverted' : '',
|
|
|
|
tree ? 'layui-nav-tree' : '',
|
|
|
|
theme === 'dark' ? 'layui-nav-dark' : 'layui-nav-light',
|
2022-02-25 02:17:12 +00:00
|
|
|
collapse ? 'layui-nav-collapse' : '',
|
2022-02-16 09:22:55 +00:00
|
|
|
]"
|
|
|
|
>
|
2022-01-31 23:23:20 +00:00
|
|
|
<slot></slot>
|
|
|
|
</ul>
|
2022-02-16 09:22:55 +00:00
|
|
|
</template>
|