update menu
parent
6e3caa6011
commit
94b420dbc3
|
@ -2,13 +2,8 @@ import warning from 'warning'
|
|||
|
||||
const warned = {}
|
||||
export default (valid, message, throwError) => {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (!valid && !warned[message]) {
|
||||
warning(false, message)
|
||||
warned[message] = true
|
||||
if (throwError) {
|
||||
throw Error(message)
|
||||
}
|
||||
}
|
||||
if (!valid && !warned[message]) {
|
||||
warning(false, message)
|
||||
warned[message] = true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ export default {
|
|||
},
|
||||
inject: {
|
||||
checkboxGroupContext: { default: null },
|
||||
test: { default: null },
|
||||
},
|
||||
data () {
|
||||
const { checkboxGroupContext, checked, defaultChecked, value } = this
|
||||
|
|
|
@ -33,3 +33,5 @@ export { default as Breadcrumb } from './breadcrumb'
|
|||
export { default as Popover } from './popover'
|
||||
|
||||
export { default as Popconfirm } from './popconfirm'
|
||||
|
||||
export { default as Menu } from './menu'
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
<template>
|
||||
<div>
|
||||
<Menu
|
||||
@click="handleClick"
|
||||
:selectedKeys="[current]"
|
||||
mode="horizontal"
|
||||
>
|
||||
<MenuItem key="mail">
|
||||
<Icon type="mail" />Navigation One
|
||||
</MenuItem>
|
||||
<MenuItem key="app" disabled>
|
||||
<Icon type="appstore" />Navigation Two
|
||||
</MenuItem>
|
||||
<SubMenu>
|
||||
<template slot="title">
|
||||
<span><Icon type="setting" />Navigation Three - Submenu</span>
|
||||
</template>
|
||||
<MenuItemGroup title="Item 1">
|
||||
<MenuItem key="setting:1">Option 1</MenuItem>
|
||||
<MenuItem key="setting:2">Option 2</MenuItem>
|
||||
</MenuItemGroup>
|
||||
<MenuItemGroup title="Item 2">
|
||||
<MenuItem key="setting:3">Option 3</MenuItem>
|
||||
<MenuItem key="setting:4">Option 4</MenuItem>
|
||||
</MenuItemGroup>
|
||||
</SubMenu>
|
||||
<MenuItem key="alipay">
|
||||
<a href="https://ant.design" target="_blank" rel="noopener noreferrer">Navigation Four - Link</a>
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { Menu, Icon } from 'antd'
|
||||
const SubMenu = Menu.SubMenu
|
||||
const MenuItemGroup = Menu.ItemGroup
|
||||
const MenuItem = Menu.Item
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
current: 'mail',
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleClick (e) {
|
||||
this.current = e.key
|
||||
},
|
||||
},
|
||||
components: {
|
||||
Menu,
|
||||
Icon,
|
||||
SubMenu,
|
||||
MenuItemGroup,
|
||||
MenuItem,
|
||||
},
|
||||
}
|
||||
|
||||
</script>
|
|
@ -1 +0,0 @@
|
|||
module.exports = require('./src/')
|
|
@ -1,6 +1,8 @@
|
|||
<script>
|
||||
import RcMenu, { Divider, ItemGroup, SubMenu } from '../src'
|
||||
import PropTypes from '../util/vue-types'
|
||||
import omit from 'omit.js'
|
||||
import cloneDeep from 'lodash.clonedeep'
|
||||
import RcMenu, { Divider, ItemGroup, SubMenu } from './src'
|
||||
import PropTypes from '../_util/vue-types'
|
||||
import animation from '../_util/openAnimation'
|
||||
import warning from '../_util/warning'
|
||||
import Item from './MenuItem'
|
||||
|
@ -13,7 +15,7 @@ export const menuProps = {
|
|||
theme: PropTypes.oneOf(['light', 'dark']).def('light'),
|
||||
mode: MenuMode,
|
||||
selectable: PropTypes.bool,
|
||||
selectedKeys: PropTypes.array,
|
||||
selectedKeys: PropTypes.arrayOf(PropTypes.string),
|
||||
defaultSelectedKeys: PropTypes.array,
|
||||
openKeys: PropTypes.array,
|
||||
defaultOpenKeys: PropTypes.array,
|
||||
|
@ -43,8 +45,39 @@ export default {
|
|||
},
|
||||
mixins: [BaseMixin],
|
||||
inject: {
|
||||
siderCollapsed: { default: undefined },
|
||||
collapsedWidth: { default: undefined },
|
||||
layoutContext: { default: {}},
|
||||
},
|
||||
watch: {
|
||||
'$props': {
|
||||
handler: function (nextProps) {
|
||||
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
},
|
||||
beforeUpdate () {
|
||||
const { preProps, $props: nextProps, layoutContext, preLayoutContext = {}} = this
|
||||
const { prefixCls } = preProps
|
||||
if (preProps.mode === 'inline' &&
|
||||
nextProps.mode !== 'inline') {
|
||||
this.switchModeFromInline = true
|
||||
}
|
||||
if (hasProp(this, 'openKeys')) {
|
||||
this.setState({ sOpenKeys: nextProps.openKeys })
|
||||
return
|
||||
}
|
||||
if ((nextProps.inlineCollapsed && !preProps.inlineCollapsed) ||
|
||||
(layoutContext.siderCollapsed && !preLayoutContext.siderCollapsed)) {
|
||||
this.switchModeFromInline =
|
||||
!!this.state.openKeys.length && !!this.$el.querySelectorAll(`.${prefixCls}-submenu-open`).length
|
||||
this.inlineOpenKeys = this.state.openKeys
|
||||
this.setState({ sOpenKeys: [] })
|
||||
}
|
||||
if ((!nextProps.inlineCollapsed && preProps.inlineCollapsed) ||
|
||||
(!layoutContext.siderCollapsed && preLayoutContext.siderCollapsed)) {
|
||||
this.setState({ sOpenKeys: this.inlineOpenKeys })
|
||||
this.inlineOpenKeys = []
|
||||
}
|
||||
},
|
||||
data () {
|
||||
const props = this.$props
|
||||
|
@ -68,22 +101,15 @@ export default {
|
|||
methods: {
|
||||
handleClick (e) {
|
||||
this.handleOpenChange([])
|
||||
const { onClick } = this.props
|
||||
if (onClick) {
|
||||
onClick(e)
|
||||
}
|
||||
this.$emit('click', e)
|
||||
},
|
||||
handleOpenChange (openKeys) {
|
||||
this.setOpenKeys(openKeys)
|
||||
|
||||
const { onOpenChange } = this.props
|
||||
if (onOpenChange) {
|
||||
onOpenChange(openKeys)
|
||||
}
|
||||
this.$emit('openChange', openKeys)
|
||||
},
|
||||
setOpenKeys (openKeys) {
|
||||
if (!('openKeys' in this.props)) {
|
||||
this.setState({ openKeys })
|
||||
if (!hasProp(this, 'openKeys')) {
|
||||
this.setState({ sOpenKeys: openKeys })
|
||||
}
|
||||
},
|
||||
getRealMenuMode () {
|
||||
|
@ -91,18 +117,18 @@ export default {
|
|||
if (this.switchModeFromInline && inlineCollapsed) {
|
||||
return 'inline'
|
||||
}
|
||||
const { mode } = this.props
|
||||
const { mode } = this.$props
|
||||
return inlineCollapsed ? 'vertical' : mode
|
||||
},
|
||||
getInlineCollapsed () {
|
||||
const { inlineCollapsed } = this.props
|
||||
if (this.context.siderCollapsed !== undefined) {
|
||||
return this.context.siderCollapsed
|
||||
const { inlineCollapsed } = this.$props
|
||||
if (this.layoutContext.siderCollapsed !== undefined) {
|
||||
return this.layoutContext.siderCollapsed
|
||||
}
|
||||
return inlineCollapsed
|
||||
},
|
||||
getMenuOpenAnimation (menuMode) {
|
||||
const { openAnimation, openTransitionName } = this.props
|
||||
const { openAnimation, openTransitionName } = this.$props
|
||||
let menuOpenAnimation = openAnimation || openTransitionName
|
||||
if (openAnimation === undefined && openTransitionName === undefined) {
|
||||
switch (menuMode) {
|
||||
|
@ -124,10 +150,11 @@ export default {
|
|||
case 'inline':
|
||||
menuOpenAnimation = {
|
||||
...animation,
|
||||
leave: (node, done: () => void) => animation.leave(node, () => {
|
||||
leave: (node, done) => animation.leave(node, () => {
|
||||
// Make sure inline menu leave animation finished before mode is switched
|
||||
this.switchModeFromInline = false
|
||||
this.setState({})
|
||||
// this.setState({})
|
||||
this.$forceUpdate()
|
||||
// when inlineCollapsed change false to true, all submenu will be unmounted,
|
||||
// so that we don't need handle animation leaving.
|
||||
if (this.getRealMenuMode() === 'vertical') {
|
||||
|
@ -143,32 +170,15 @@ export default {
|
|||
return menuOpenAnimation
|
||||
},
|
||||
},
|
||||
|
||||
componentWillReceiveProps (nextProps, nextContext) {
|
||||
const { prefixCls } = this.props
|
||||
if (this.props.mode === 'inline' &&
|
||||
nextProps.mode !== 'inline') {
|
||||
this.switchModeFromInline = true
|
||||
}
|
||||
if ('openKeys' in nextProps) {
|
||||
this.setState({ openKeys: nextProps.openKeys })
|
||||
return
|
||||
}
|
||||
if ((nextProps.inlineCollapsed && !this.props.inlineCollapsed) ||
|
||||
(nextContext.siderCollapsed && !this.context.siderCollapsed)) {
|
||||
this.switchModeFromInline =
|
||||
!!this.state.openKeys.length && !!this.$el.querySelectorAll(`.${prefixCls}-submenu-open`).length
|
||||
this.inlineOpenKeys = this.state.openKeys
|
||||
this.setState({ openKeys: [] })
|
||||
}
|
||||
if ((!nextProps.inlineCollapsed && this.props.inlineCollapsed) ||
|
||||
(!nextContext.siderCollapsed && this.context.siderCollapsed)) {
|
||||
this.setState({ openKeys: this.inlineOpenKeys })
|
||||
this.inlineOpenKeys = []
|
||||
}
|
||||
},
|
||||
render () {
|
||||
const { prefixCls, className, theme } = this.props
|
||||
const { $props, layoutContext, $slots } = this
|
||||
const { collapsedWidth, siderCollapsed } = layoutContext
|
||||
this.preProps = cloneDeep($props)
|
||||
this.preLayoutContext = {
|
||||
siderCollapsed,
|
||||
collapsedWidth,
|
||||
}
|
||||
const { prefixCls, theme } = this.$props
|
||||
const menuMode = this.getRealMenuMode()
|
||||
const menuOpenAnimation = this.getMenuOpenAnimation(menuMode)
|
||||
|
||||
|
@ -178,22 +188,26 @@ export default {
|
|||
}
|
||||
|
||||
const menuProps = {
|
||||
openKeys: this.state.openKeys,
|
||||
onOpenChange: this.handleOpenChange,
|
||||
className: menuClassName,
|
||||
mode: menuMode,
|
||||
props: {
|
||||
...omit(this.$props, ['inlineCollapsed']),
|
||||
openKeys: this.sOpenKeys,
|
||||
mode: menuMode,
|
||||
},
|
||||
on: {
|
||||
openChange: this.handleOpenChange,
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
if (menuMode !== 'inline') {
|
||||
// closing vertical popup submenu after click it
|
||||
menuProps.onClick = this.handleClick
|
||||
menuProps.openTransitionName = menuOpenAnimation
|
||||
menuProps.on.click = this.handleClick
|
||||
menuProps.props.openTransitionName = menuOpenAnimation
|
||||
} else {
|
||||
menuProps.openAnimation = menuOpenAnimation
|
||||
menuProps.props.openAnimation = menuOpenAnimation
|
||||
}
|
||||
|
||||
// https://github.com/ant-design/ant-design/issues/8587
|
||||
const { collapsedWidth } = this.context
|
||||
if (
|
||||
this.getInlineCollapsed() &&
|
||||
(collapsedWidth === 0 || collapsedWidth === '0' || collapsedWidth === '0px')
|
||||
|
@ -201,7 +215,7 @@ export default {
|
|||
return null
|
||||
}
|
||||
|
||||
return <RcMenu {...this.props} {...menuProps} />
|
||||
return <RcMenu {...menuProps} class={menuClassName}>{$slots.default}</RcMenu>
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -2,8 +2,9 @@ import hasProp from '../../_util/props-util'
|
|||
import KeyCode from '../../_util/KeyCode'
|
||||
import scrollIntoView from 'dom-scroll-into-view'
|
||||
import { getKeyFromChildrenIndex, loopMenuItem } from './util'
|
||||
import { cloneElement } from '../../_util/vnode'
|
||||
import { cloneElement, getComponentName } from '../../_util/vnode'
|
||||
import DOMWrap from './DOMWrap'
|
||||
import warning from '../../_util/warning'
|
||||
|
||||
function allDisabled (arr) {
|
||||
if (!arr.length) {
|
||||
|
@ -133,6 +134,10 @@ export default {
|
|||
},
|
||||
|
||||
renderCommonMenuItem (child, i, subIndex, extraProps) {
|
||||
if (child.tag === undefined) { return child }
|
||||
warning((getComponentName(child.componentOptions) || '').indexOf(['MenuItem', 'MenuItemGroup']) === -1,
|
||||
'`Menu child just support MenuItem and MenuItemGroup',
|
||||
)
|
||||
const state = this.$data
|
||||
const props = this.$props
|
||||
const key = getKeyFromChildrenIndex(child, props.eventKey, i)
|
||||
|
|
|
@ -6,6 +6,7 @@ import SubPopupMenu from './SubPopupMenu'
|
|||
import placements from './placements'
|
||||
import { loopMenuItemRecusively, noop } from './util'
|
||||
import BaseMixin from '../../_util/BaseMixin'
|
||||
import { getComponentFromProp } from '../../_util/props-util'
|
||||
|
||||
let guid = 0
|
||||
|
||||
|
@ -197,7 +198,6 @@ export default {
|
|||
this.__emit('itemClick', {
|
||||
key: eventKey,
|
||||
domEvent: e,
|
||||
test: 111,
|
||||
})
|
||||
if (triggerSubMenuAction === 'hover') {
|
||||
return
|
||||
|
@ -384,8 +384,7 @@ export default {
|
|||
<div
|
||||
{...titleProps}
|
||||
>
|
||||
{typeof props.title === 'function' ? props.title(h) : props.title}
|
||||
{this.$slots.title}
|
||||
{getComponentFromProp(this, h, 'title')}
|
||||
<i class={`${prefixCls}-arrow`} />
|
||||
</div>
|
||||
)
|
||||
|
|
|
@ -14,7 +14,7 @@ export default {
|
|||
mode: PropTypes.oneOf(['horizontal', 'vertical', 'vertical-left', 'vertical-right', 'inline']).def('vertical'),
|
||||
triggerSubMenuAction: PropTypes.string.def('hover'),
|
||||
openTransitionName: PropTypes.string,
|
||||
subMenuOpenDelay: PropTypes.number.def(0),
|
||||
subMenuOpenDelay: PropTypes.number.def(0.1),
|
||||
subMenuCloseDelay: PropTypes.number.def(0.1),
|
||||
level: PropTypes.number.def(1),
|
||||
inlineIndent: PropTypes.number.def(24),
|
||||
|
|
|
@ -13,10 +13,10 @@ export function loopMenuItem (children, cb) {
|
|||
if (c && c.type && c.type.isMenuItemGroup) {
|
||||
c.$slots.default.forEach((c2) => {
|
||||
index++
|
||||
cb(c2, index)
|
||||
c.componentOptions && cb(c2, index)
|
||||
})
|
||||
} else {
|
||||
cb(c, index)
|
||||
c.componentOptions && cb(c, index)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -13,5 +13,4 @@ import './input/style'
|
|||
import './tooltip/style'
|
||||
import './popover/style'
|
||||
import './popconfirm/style'
|
||||
|
||||
import './menu/style'
|
||||
|
|
|
@ -3,7 +3,7 @@ const AsyncComp = () => {
|
|||
const com = pathnameArr[1] || 'button'
|
||||
const demo = pathnameArr[2] || 'index'
|
||||
return {
|
||||
component: import(`../components/avatar/demo/${demo}.vue`),
|
||||
component: import(`../components/menu/demo/${demo}.vue`),
|
||||
}
|
||||
}
|
||||
export default [
|
||||
|
|
Loading…
Reference in New Issue