ant-design-vue/components/layout/layout.jsx

99 lines
2.0 KiB
Vue
Raw Normal View History

2018-04-20 04:52:31 +00:00
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