import PropTypes from '../_util/vue-types'; import classNames from 'classnames'; import { getOptionProps, getListeners } from '../_util/props-util'; import { ConfigConsumerProps } from '../config-provider'; export const BasicProps = { prefixCls: PropTypes.string, hasSider: PropTypes.boolean, }; function generator(props, name) { return BasicComponent => { return { name, props: BasicComponent.props, inject: { configProvider: { default: () => ConfigConsumerProps }, }, render() { const { suffixCls } = props; const { prefixCls: customizePrefixCls } = this.$props; const getPrefixCls = this.configProvider.getPrefixCls; const prefixCls = getPrefixCls(suffixCls, customizePrefixCls); const basicComponentProps = { props: { prefixCls, ...getOptionProps(this), }, on: getListeners(this), }; return {this.$slots.default}; }, }; }; } const Basic = { props: BasicProps, render() { const { prefixCls, $slots } = this; const divProps = { class: prefixCls, on: getListeners(this), }; return
{$slots.default}
; }, }; const BasicLayout = { props: BasicProps, data() { return { siders: [], }; }, provide() { return { siderHook: { addSider: id => { this.siders = [...this.siders, id]; }, removeSider: id => { this.siders = this.siders.filter(currentId => currentId !== id); }, }, }; }, render() { const { prefixCls, $slots, hasSider } = this; const divCls = classNames(prefixCls, { [`${prefixCls}-has-sider`]: hasSider || this.siders.length > 0, }); const divProps = { class: divCls, on: getListeners, }; return
{$slots.default}
; }, }; const Layout = generator( { suffixCls: 'layout', }, 'ALayout', )(BasicLayout); const Header = generator( { suffixCls: 'layout-header', }, 'ALayoutHeader', )(Basic); const Footer = generator( { suffixCls: 'layout-footer', }, 'ALayoutFooter', )(Basic); const Content = generator( { suffixCls: 'layout-content', }, 'ALayoutContent', )(Basic); Layout.Header = Header; Layout.Footer = Footer; Layout.Content = Content; export default Layout;