fix: 横向导航栏模式下 children 无法自动隐藏
This commit is contained in:
parent
9726687879
commit
18990ef594
@ -13,7 +13,7 @@
|
|||||||
::: demo
|
::: demo
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-menu v-model:selectedKey="selectedKey" v-model:openKeys="openKeys">
|
<lay-menu v-model:selectedKey="selectedKey" v-model:openKeys="openKeys1">
|
||||||
<lay-menu-item title="首页" id="1"></lay-menu-item>
|
<lay-menu-item title="首页" id="1"></lay-menu-item>
|
||||||
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
||||||
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
||||||
@ -40,10 +40,10 @@ export default {
|
|||||||
setup() {
|
setup() {
|
||||||
|
|
||||||
const selectedKey = ref("5")
|
const selectedKey = ref("5")
|
||||||
const openKeys = ref(["7"])
|
const openKeys1 = ref(["7"])
|
||||||
return {
|
return {
|
||||||
selectedKey,
|
selectedKey,
|
||||||
openKeys
|
openKeys1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,7 +57,7 @@ export default {
|
|||||||
::: demo
|
::: demo
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-menu v-model:selectedKey="selectedKey" v-model:openKeys="openKeys" :tree="true">
|
<lay-menu v-model:selectedKey="selectedKey" v-model:openKeys="openKeys2" :tree="true">
|
||||||
<lay-menu-item title="首页" id="1"></lay-menu-item>
|
<lay-menu-item title="首页" id="1"></lay-menu-item>
|
||||||
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
||||||
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
||||||
@ -79,11 +79,11 @@ import { ref } from 'vue'
|
|||||||
export default {
|
export default {
|
||||||
setup() {
|
setup() {
|
||||||
|
|
||||||
const openKeys = ref(["7"])
|
const openKeys2 = ref(["7"])
|
||||||
const selectedKey = ref("5")
|
const selectedKey = ref("5")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
openKeys,
|
openKeys2,
|
||||||
selectedKey
|
selectedKey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ export default {
|
|||||||
::: demo
|
::: demo
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-menu level="true" v-model:selectedKey="selectedKey" inverted="true" v-model:openKeys="openKeys" :tree="true">
|
<lay-menu level="true" v-model:selectedKey="selectedKey" inverted="true" v-model:openKeys="openKeys3" :tree="true">
|
||||||
<lay-menu-item title="首页" id="1"></lay-menu-item>
|
<lay-menu-item title="首页" id="1"></lay-menu-item>
|
||||||
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
||||||
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
||||||
@ -120,11 +120,11 @@ import { ref } from 'vue'
|
|||||||
export default {
|
export default {
|
||||||
setup() {
|
setup() {
|
||||||
|
|
||||||
const openKeys = ref(["7"])
|
const openKeys3 = ref(["7"])
|
||||||
const selectedKey = ref("5")
|
const selectedKey = ref("5")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
openKeys,
|
openKeys3,
|
||||||
selectedKey
|
selectedKey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -139,7 +139,7 @@ export default {
|
|||||||
::: demo
|
::: demo
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-menu v-model:selectedKey="selectedKey" theme="light" v-model:openKeys="openKeys" :tree="true">
|
<lay-menu v-model:selectedKey="selectedKey" theme="light" v-model:openKeys="openKeys4" :tree="true">
|
||||||
<lay-menu-item title="首页" id="1"></lay-menu-item>
|
<lay-menu-item title="首页" id="1"></lay-menu-item>
|
||||||
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
<lay-menu-item title="用户" id="2"></lay-menu-item>
|
||||||
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
<lay-menu-item title="角色" id="3"></lay-menu-item>
|
||||||
@ -161,11 +161,11 @@ import { ref } from 'vue'
|
|||||||
export default {
|
export default {
|
||||||
setup() {
|
setup() {
|
||||||
|
|
||||||
const openKeys = ref(["7"])
|
const openKeys4 = ref(["7"])
|
||||||
const selectedKey = ref("5")
|
const selectedKey = ref("5")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
openKeys,
|
openKeys4,
|
||||||
selectedKey
|
selectedKey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,7 +180,7 @@ export default {
|
|||||||
::: demo
|
::: demo
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<lay-menu v-model:selectedKey="selectedKey" v-model:openKeys="openKeys" v-model:tree="isTree">
|
<lay-menu v-model:selectedKey="selectedKey" v-model:openKeys="openKeys5" v-model:tree="isTree">
|
||||||
<lay-menu-item id="1">
|
<lay-menu-item id="1">
|
||||||
<router-link to="">
|
<router-link to="">
|
||||||
<lay-icon type="layui-icon-home"></lay-icon>
|
<lay-icon type="layui-icon-home"></lay-icon>
|
||||||
@ -218,11 +218,11 @@ export default {
|
|||||||
|
|
||||||
const isTree = ref(true)
|
const isTree = ref(true)
|
||||||
const selectedKey = ref("5")
|
const selectedKey = ref("5")
|
||||||
const openKeys = ref(["7"])
|
const openKeys5 = ref(["7"])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
isTree,
|
isTree,
|
||||||
openKeys,
|
openKeys5,
|
||||||
selectedKey
|
selectedKey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,12 @@
|
|||||||
::: title 基础使用
|
::: title 基础使用
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
::: describe 常用于行数据的交互筛选,在浩瀚的业务需求中,值得一用。
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: title 基础使用
|
||||||
|
:::
|
||||||
|
|
||||||
::: demo 使用 `lay-transfer` 标签, 创建穿梭框
|
::: demo 使用 `lay-transfer` 标签, 创建穿梭框
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -22,32 +22,31 @@ const themeVariable = {
|
|||||||
:::
|
:::
|
||||||
|
|
||||||
```
|
```
|
||||||
--global-primary-color: #009688;
|
--global-primary-color: #009688; // 主题色
|
||||||
|
|
||||||
--global-normal-color: #1e9fff;
|
--global-normal-color: #1e9fff; // 通用色
|
||||||
|
|
||||||
--global-warm-color: #ffb800;
|
--global-warm-color: #ffb800; // 警告色
|
||||||
|
|
||||||
--global-danger-color: #ff5722;
|
--global-danger-color: #ff5722; // 危险色
|
||||||
|
|
||||||
--global-checked-color: #5fb878;
|
--global-checked-color: #5fb878; // 选中色
|
||||||
|
|
||||||
--global-border-radius: 2px;
|
--global-border-radius: 2px; // 圆角度
|
||||||
|
|
||||||
--global-neutral-color-1: #FAFAFA;
|
--global-neutral-color-1: #FAFAFA; // 辅助色-1
|
||||||
|
|
||||||
--global-neutral-color-2: #F6F6F6;
|
--global-neutral-color-2: #F6F6F6; // 辅助色-2
|
||||||
|
|
||||||
|
--global-neutral-color-3: #eeeeee; // 辅助色-3
|
||||||
|
|
||||||
|
--global-neutral-color-4: #e2e2e2; // 辅助色-4
|
||||||
|
|
||||||
--global-neutral-color-3: #eeeeee;
|
--global-neutral-color-5: #dddddd; // 辅助色-5
|
||||||
|
|
||||||
--global-neutral-color-4: #e2e2e2;
|
--global-neutral-color-6: #d2d2d2; // 辅助色-6
|
||||||
|
|
||||||
--global-neutral-color-5: #dddddd;
|
--global-neutral-color-7: #cccccc; // 辅助色-7
|
||||||
|
|
||||||
--global-neutral-color-6: #d2d2d2;
|
--global-neutral-color-8: #c2c2c2; // 辅助色-8
|
||||||
|
|
||||||
--global-neutral-color-7: #cccccc;
|
|
||||||
|
|
||||||
--global-neutral-color-8: #c2c2c2;
|
|
||||||
|
|
||||||
```
|
```
|
@ -5,8 +5,8 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { provide, ref, watch } from "vue"
|
import { provide, ref, watch } from "vue";
|
||||||
import { onClickOutside } from "@vueuse/core"
|
import { onClickOutside } from "@vueuse/core";
|
||||||
|
|
||||||
export interface LayDropdownProps {
|
export interface LayDropdownProps {
|
||||||
trigger?: string;
|
trigger?: string;
|
||||||
@ -19,8 +19,8 @@ const props = withDefaults(defineProps<LayDropdownProps>(), {
|
|||||||
});
|
});
|
||||||
|
|
||||||
onClickOutside(dropdownRef, (event) => {
|
onClickOutside(dropdownRef, (event) => {
|
||||||
openState.value = false;
|
openState.value = false;
|
||||||
})
|
});
|
||||||
|
|
||||||
const openState = ref(false);
|
const openState = ref(false);
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ const selectRef = ref<null | HTMLElement>(null);
|
|||||||
|
|
||||||
onClickOutside(selectRef, (event) => {
|
onClickOutside(selectRef, (event) => {
|
||||||
openState.value = false;
|
openState.value = false;
|
||||||
})
|
});
|
||||||
|
|
||||||
const props = withDefaults(defineProps<LaySelectProps>(), {
|
const props = withDefaults(defineProps<LaySelectProps>(), {
|
||||||
modelValue: null,
|
modelValue: null,
|
||||||
|
@ -14,6 +14,7 @@ import {
|
|||||||
useSlots,
|
useSlots,
|
||||||
watch,
|
watch,
|
||||||
} from "vue";
|
} from "vue";
|
||||||
|
import { onClickOutside } from "@vueuse/core";
|
||||||
|
|
||||||
export interface LaySubMenuProps {
|
export interface LaySubMenuProps {
|
||||||
id: string;
|
id: string;
|
||||||
@ -24,10 +25,23 @@ const slots = useSlots();
|
|||||||
|
|
||||||
const props = defineProps<LaySubMenuProps>();
|
const props = defineProps<LaySubMenuProps>();
|
||||||
|
|
||||||
const isTree = inject("isTree");
|
const isTree: Ref<boolean> = inject("isTree") as Ref<boolean>;
|
||||||
const selectedKey: Ref<string> = inject("selectedKey") as Ref<string>;
|
const selectedKey: Ref<string> = inject("selectedKey") as Ref<string>;
|
||||||
const openKeys: Ref<string[]> = inject("openKeys") as Ref<string[]>;
|
const openKeys: Ref<string[]> = inject("openKeys") as Ref<string[]>;
|
||||||
|
|
||||||
|
const isOpen = computed(() => {
|
||||||
|
return openKeys.value.includes(props.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
const subMenuRef = ref<HTMLElement>();
|
||||||
|
const position = ref<String>();
|
||||||
|
|
||||||
|
watch(isOpen, () => {
|
||||||
|
if (isOpen.value && position.value !== "left-nav") {
|
||||||
|
setTimeout(setPosition, 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const openHandle = function () {
|
const openHandle = function () {
|
||||||
if (openKeys.value.includes(props.id)) {
|
if (openKeys.value.includes(props.id)) {
|
||||||
openKeys.value.splice(openKeys.value.indexOf(props.id), 1);
|
openKeys.value.splice(openKeys.value.indexOf(props.id), 1);
|
||||||
@ -36,32 +50,30 @@ const openHandle = function () {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const isOpen = computed(() => {
|
|
||||||
return openKeys.value.includes(props.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 菜单显示位置
|
|
||||||
const layuiNavChild = ref<HTMLElement>();
|
|
||||||
const position = ref<String>();
|
|
||||||
watch(isOpen, () => {
|
|
||||||
if (isOpen.value && position.value !== "left-nav") {
|
|
||||||
setTimeout(setPosition, 0);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const setPosition = function () {
|
const setPosition = function () {
|
||||||
if (!isTree || !layuiNavChild.value) {
|
if (!isTree.value || !subMenuRef.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const offsetWidth = layuiNavChild.value.offsetWidth;
|
const offsetWidth = subMenuRef.value.offsetWidth;
|
||||||
if (
|
if (
|
||||||
window.innerWidth <
|
window.innerWidth <
|
||||||
layuiNavChild.value.getBoundingClientRect().left + offsetWidth + 10
|
subMenuRef.value.getBoundingClientRect().left + offsetWidth + 10
|
||||||
) {
|
) {
|
||||||
position.value = "left-nav";
|
position.value = "left-nav";
|
||||||
} else {
|
} else {
|
||||||
position.value = "";
|
position.value = "";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onClickOutside(subMenuRef, (event: PointerEvent) => {
|
||||||
|
if (!isTree.value) {
|
||||||
|
let index = openKeys.value.indexOf(props.id);
|
||||||
|
if (index != -1) {
|
||||||
|
openKeys.value.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
window.addEventListener("resize", setPosition);
|
window.addEventListener("resize", setPosition);
|
||||||
onBeforeUnmount(() => window.removeEventListener("resize", setPosition));
|
onBeforeUnmount(() => window.removeEventListener("resize", setPosition));
|
||||||
</script>
|
</script>
|
||||||
@ -81,7 +93,7 @@ onBeforeUnmount(() => window.removeEventListener("resize", setPosition));
|
|||||||
</a>
|
</a>
|
||||||
<dl
|
<dl
|
||||||
class="layui-nav-child"
|
class="layui-nav-child"
|
||||||
ref="layuiNavChild"
|
ref="subMenuRef"
|
||||||
:class="[
|
:class="[
|
||||||
position,
|
position,
|
||||||
isOpen && !isTree ? 'layui-show' : '',
|
isOpen && !isTree ? 'layui-show' : '',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user