You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.0 KiB
99 lines
2.0 KiB
import PropTypes from '../_util/vue-types'
|
|
import classNames from 'classnames'
|
|
import { getOptionProps } from '../_util/props-util'
|
|
|
|
export const BasicProps = {
|
|
prefixCls: PropTypes.string,
|
|
hasSider: PropTypes.boolean,
|
|
}
|
|
|
|
function generator (props, name) {
|
|
return (BasicComponent) => {
|
|
return {
|
|
name,
|
|
props: BasicComponent.props,
|
|
render () {
|
|
const { prefixCls } = props
|
|
const basicComponentProps = {
|
|
props: {
|
|
prefixCls,
|
|
...getOptionProps(this),
|
|
},
|
|
on: this.$listeners,
|
|
}
|
|
return <BasicComponent {...basicComponentProps}>{this.$slots.default}</BasicComponent>
|
|
},
|
|
}
|
|
}
|
|
}
|
|
|
|
const Basic = {
|
|
props: BasicProps,
|
|
render () {
|
|
const { prefixCls, $slots, $listeners } = this
|
|
const divProps = {
|
|
class: prefixCls,
|
|
on: $listeners,
|
|
}
|
|
return (
|
|
<div {...divProps}>{$slots.default}</div>
|
|
)
|
|
},
|
|
}
|
|
|
|
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, $listeners } = this
|
|
const divCls = classNames(prefixCls, {
|
|
[`${prefixCls}-has-sider`]: hasSider || this.siders.length > 0,
|
|
})
|
|
const divProps = {
|
|
class: divCls,
|
|
on: $listeners,
|
|
}
|
|
return (
|
|
<div {...divProps}>{$slots.default}</div>
|
|
)
|
|
},
|
|
}
|
|
|
|
const Layout = generator({
|
|
prefixCls: 'ant-layout',
|
|
}, 'ALayout')(BasicLayout)
|
|
|
|
const Header = generator({
|
|
prefixCls: 'ant-layout-header',
|
|
}, 'ALayoutHeader')(Basic)
|
|
|
|
const Footer = generator({
|
|
prefixCls: 'ant-layout-footer',
|
|
}, 'ALayoutFooter')(Basic)
|
|
|
|
const Content = generator({
|
|
prefixCls: 'ant-layout-content',
|
|
}, 'ALayoutContent')(Basic)
|
|
|
|
Layout.Header = Header
|
|
Layout.Footer = Footer
|
|
Layout.Content = Content
|
|
|
|
export default Layout
|