feat: add menu template support
							parent
							
								
									a16ca20770
								
							
						
					
					
						commit
						f10d0f1e4d
					
				| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
Subproject commit b35f6ab6b59169fa7c0413263f75c185bd62b97c
 | 
			
		||||
Subproject commit ab46da93f0bca77a66a25f0ef427fa106d6dff13
 | 
			
		||||
| 
						 | 
				
			
			@ -8,7 +8,7 @@ function getDisplayName(WrappedComponent) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
const defaultMapStateToProps = () => ({});
 | 
			
		||||
export default function connect(mapStateToProps) {
 | 
			
		||||
export default function connect(mapStateToProps, injectExtraPropsKey) {
 | 
			
		||||
  const shouldSubscribe = !!mapStateToProps;
 | 
			
		||||
  const finalMapStateToProps = mapStateToProps || defaultMapStateToProps;
 | 
			
		||||
  return function wrapWithConnect(WrappedComponent) {
 | 
			
		||||
| 
						 | 
				
			
			@ -24,18 +24,25 @@ export default function connect(mapStateToProps) {
 | 
			
		|||
      setup() {
 | 
			
		||||
        return {
 | 
			
		||||
          storeContext: inject('storeContext', {}),
 | 
			
		||||
          injectExtraProps: injectExtraPropsKey ? inject(injectExtraPropsKey, () => ({})) : {},
 | 
			
		||||
        };
 | 
			
		||||
      },
 | 
			
		||||
      data() {
 | 
			
		||||
        this.store = this.storeContext.store;
 | 
			
		||||
        this.preProps = getOptionProps(this);
 | 
			
		||||
        this.preProps = { ...getOptionProps(this), ...this.injectExtraProps };
 | 
			
		||||
        watchEffect(() => {
 | 
			
		||||
          if (mapStateToProps && mapStateToProps.length === 2) {
 | 
			
		||||
            this.subscribed = finalMapStateToProps(this.store.getState(), this.$props);
 | 
			
		||||
            this.subscribed = finalMapStateToProps(this.store.getState(), {
 | 
			
		||||
              ...this.$props,
 | 
			
		||||
              ...this.injectExtraProps,
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
        return {
 | 
			
		||||
          subscribed: finalMapStateToProps(this.store.getState(), this.$props),
 | 
			
		||||
          subscribed: finalMapStateToProps(this.store.getState(), {
 | 
			
		||||
            ...this.$props,
 | 
			
		||||
            ...this.injectExtraProps,
 | 
			
		||||
          }),
 | 
			
		||||
        };
 | 
			
		||||
      },
 | 
			
		||||
      mounted() {
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +57,7 @@ export default function connect(mapStateToProps) {
 | 
			
		|||
          if (!this.unsubscribe) {
 | 
			
		||||
            return;
 | 
			
		||||
          }
 | 
			
		||||
          const props = getOptionProps(this);
 | 
			
		||||
          const props = { ...getOptionProps(this), ...this.injectExtraProps };
 | 
			
		||||
          const nextSubscribed = finalMapStateToProps(this.store.getState(), props);
 | 
			
		||||
          if (
 | 
			
		||||
            !shallowEqual(this.preProps, props) ||
 | 
			
		||||
| 
						 | 
				
			
			@ -79,12 +86,12 @@ export default function connect(mapStateToProps) {
 | 
			
		|||
      },
 | 
			
		||||
      render() {
 | 
			
		||||
        const { $slots = {}, subscribed, store, $attrs } = this;
 | 
			
		||||
        const props = getOptionProps(this);
 | 
			
		||||
        const props = { ...getOptionProps(this), ...this.injectExtraProps };
 | 
			
		||||
        this.preProps = { ...props };
 | 
			
		||||
        const wrapProps = {
 | 
			
		||||
          ...$attrs,
 | 
			
		||||
          ...props,
 | 
			
		||||
          ...subscribed,
 | 
			
		||||
          ...$attrs,
 | 
			
		||||
          store,
 | 
			
		||||
          ref: 'wrappedInstance',
 | 
			
		||||
        };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
import PropTypes from '../_util/vue-types';
 | 
			
		||||
import { provide, reactive } from 'vue';
 | 
			
		||||
 | 
			
		||||
const FunctionProvider = {
 | 
			
		||||
  inheritAttrs: false,
 | 
			
		||||
  props: {
 | 
			
		||||
    injectExtraPropsKey: PropTypes.string,
 | 
			
		||||
  },
 | 
			
		||||
  setup(props, { slots, attrs }) {
 | 
			
		||||
    if (props.injectExtraPropsKey) {
 | 
			
		||||
      provide(props.injectExtraPropsKey, reactive(attrs));
 | 
			
		||||
    }
 | 
			
		||||
    return () => slots.default && slots.default();
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default FunctionProvider;
 | 
			
		||||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ import { connect } from '../_util/store';
 | 
			
		|||
import { noop, menuAllProps } from './util';
 | 
			
		||||
import { getComponent, getSlot, findDOMNode } from '../_util/props-util';
 | 
			
		||||
import { inject } from 'vue';
 | 
			
		||||
 | 
			
		||||
const injectExtraPropsKey = 'ANT_MENU_PROVIDER_PROPS_KEY';
 | 
			
		||||
const props = {
 | 
			
		||||
  attribute: PropTypes.object,
 | 
			
		||||
  rootPrefixCls: PropTypes.string,
 | 
			
		||||
| 
						 | 
				
			
			@ -199,10 +199,13 @@ const MenuItem = {
 | 
			
		|||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const connected = connect(({ activeKey, selectedKeys }, { eventKey, subMenuKey }) => ({
 | 
			
		||||
  active: activeKey[subMenuKey] === eventKey,
 | 
			
		||||
  isSelected: selectedKeys.indexOf(eventKey) !== -1,
 | 
			
		||||
}))(MenuItem);
 | 
			
		||||
const connected = connect(
 | 
			
		||||
  ({ activeKey, selectedKeys }, { eventKey, subMenuKey }) => ({
 | 
			
		||||
    active: activeKey[subMenuKey] === eventKey,
 | 
			
		||||
    isSelected: selectedKeys.indexOf(eventKey) !== -1,
 | 
			
		||||
  }),
 | 
			
		||||
  injectExtraPropsKey,
 | 
			
		||||
)(MenuItem);
 | 
			
		||||
 | 
			
		||||
export default connected;
 | 
			
		||||
export { props as menuItemProps };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ import { noop, loopMenuItemRecursively, getMenuIdFromSubMenuEventKey } from './u
 | 
			
		|||
import getTransitionProps from '../_util/getTransitionProps';
 | 
			
		||||
 | 
			
		||||
let guid = 0;
 | 
			
		||||
 | 
			
		||||
const injectExtraPropsKey = 'ANT_MENU_PROVIDER_PROPS_KEY';
 | 
			
		||||
const popupPlacementMap = {
 | 
			
		||||
  horizontal: 'bottomLeft',
 | 
			
		||||
  vertical: 'rightTop',
 | 
			
		||||
| 
						 | 
				
			
			@ -337,6 +337,7 @@ const SubMenu = {
 | 
			
		|||
    },
 | 
			
		||||
    renderChildren(children) {
 | 
			
		||||
      const props = { ...this.$props, ...this.$attrs };
 | 
			
		||||
 | 
			
		||||
      const subPopupMenuProps = {
 | 
			
		||||
        mode: props.mode === 'horizontal' ? 'vertical' : props.mode,
 | 
			
		||||
        visible: props.isOpen,
 | 
			
		||||
| 
						 | 
				
			
			@ -541,7 +542,7 @@ const connected = connect(({ openKeys, activeKey, selectedKeys }, { eventKey, su
 | 
			
		|||
    active: activeKey[subMenuKey] === eventKey,
 | 
			
		||||
    selectedKeys,
 | 
			
		||||
  };
 | 
			
		||||
})(SubMenu);
 | 
			
		||||
}, injectExtraPropsKey)(SubMenu);
 | 
			
		||||
 | 
			
		||||
connected.isSubMenu = true;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,6 @@ import KeyCode from '../_util/KeyCode';
 | 
			
		|||
import classNames from '../_util/classNames';
 | 
			
		||||
import { getKeyFromChildrenIndex, loopMenuItem, noop, isMobileDevice, menuAllProps } from './util';
 | 
			
		||||
import DOMWrap from './DOMWrap';
 | 
			
		||||
import { cloneElement } from '../_util/vnode';
 | 
			
		||||
import {
 | 
			
		||||
  initDefaultProps,
 | 
			
		||||
  getOptionProps,
 | 
			
		||||
| 
						 | 
				
			
			@ -14,7 +13,8 @@ import {
 | 
			
		|||
  splitAttrs,
 | 
			
		||||
  getPropsData,
 | 
			
		||||
} from '../_util/props-util';
 | 
			
		||||
 | 
			
		||||
import FunctionProvider from './FunctionProvider';
 | 
			
		||||
const injectExtraPropsKey = 'ANT_MENU_PROVIDER_PROPS_KEY';
 | 
			
		||||
function allDisabled(arr) {
 | 
			
		||||
  if (!arr.length) {
 | 
			
		||||
    return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -323,7 +323,11 @@ const SubPopupMenu = {
 | 
			
		|||
      if (props.mode === 'inline' || isMobileDevice()) {
 | 
			
		||||
        newChildProps.triggerSubMenuAction = 'click';
 | 
			
		||||
      }
 | 
			
		||||
      return cloneElement(child, newChildProps);
 | 
			
		||||
      return (
 | 
			
		||||
        <FunctionProvider injectExtraPropsKey={injectExtraPropsKey} {...newChildProps}>
 | 
			
		||||
          {child}
 | 
			
		||||
        </FunctionProvider>
 | 
			
		||||
      );
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    renderMenuItem(c, i, subMenuKey) {
 | 
			
		||||
| 
						 | 
				
			
			@ -389,4 +393,4 @@ const SubPopupMenu = {
 | 
			
		|||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default connect()(SubPopupMenu);
 | 
			
		||||
export default connect(undefined)(SubPopupMenu);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue