feat: layout sider support dynamic breakpoint

pull/5361/head
tangjinzhou 2022-03-17 10:32:58 +08:00
parent adbc39bfbd
commit fa9f1f4f53
2 changed files with 31 additions and 13 deletions

View File

@ -1,6 +1,15 @@
import classNames from '../_util/classNames'; import classNames from '../_util/classNames';
import type { PropType, ExtractPropTypes, CSSProperties } from 'vue'; import type { PropType, ExtractPropTypes, CSSProperties } from 'vue';
import { inject, defineComponent, ref, watch, onMounted, onBeforeUnmount, provide } from 'vue'; import {
watchEffect,
inject,
defineComponent,
ref,
watch,
onMounted,
onBeforeUnmount,
provide,
} from 'vue';
import PropTypes from '../_util/vue-types'; import PropTypes from '../_util/vue-types';
import { tuple } from '../_util/type'; import { tuple } from '../_util/type';
import initDefaultProps from '../_util/props-util/initDefaultProps'; import initDefaultProps from '../_util/props-util/initDefaultProps';
@ -114,6 +123,12 @@ export default defineComponent({
siderHook && siderHook.addSider(uniqueId); siderHook && siderHook.addSider(uniqueId);
onMounted(() => { onMounted(() => {
watchEffect(() => {
try {
mql?.removeEventListener('change', responsiveHandler);
} catch (error) {
mql?.removeListener(responsiveHandler);
}
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
const { matchMedia } = window; const { matchMedia } = window;
if (matchMedia! && props.breakpoint && props.breakpoint in dimensionMaxMap) { if (matchMedia! && props.breakpoint && props.breakpoint in dimensionMaxMap) {
@ -127,6 +142,7 @@ export default defineComponent({
} }
} }
}); });
});
onBeforeUnmount(() => { onBeforeUnmount(() => {
try { try {
mql?.removeEventListener('change', responsiveHandler); mql?.removeEventListener('change', responsiveHandler);

View File

@ -18,7 +18,9 @@ When dealing with long content, a fixed sider can provide a better user experien
</docs> </docs>
<template> <template>
<a-layout has-sider> <a-layout has-sider>
<a-layout-sider :style="{ overflow: 'auto', height: '100vh', position: 'fixed', left: 0 }"> <a-layout-sider
:style="{ overflow: 'auto', height: '100vh', position: 'fixed', left: 0, top: 0, bottom: 0 }"
>
<div class="logo" /> <div class="logo" />
<a-menu v-model:selectedKeys="selectedKeys" theme="dark" mode="inline"> <a-menu v-model:selectedKeys="selectedKeys" theme="dark" mode="inline">
<a-menu-item key="1"> <a-menu-item key="1">