From 3af108ffcba29b3c005872c052bc799b1ba92867 Mon Sep 17 00:00:00 2001
From: tangjinzhou <415800467@qq.com>
Date: Wed, 17 Jan 2018 16:12:53 +0800
Subject: [PATCH] add menu
---
components/_util/BaseMixin.js | 10 +-
components/_util/vnode.js | 65 +++++------
components/menu/MenuItem.vue | 3 +-
components/menu/demo/antd.vue | 6 +-
components/menu/demo/horizontal.vue | 1 +
components/menu/src/Menu.vue | 34 +++---
components/menu/src/MenuItem.vue | 18 ++-
components/menu/src/MenuMixin.js | 8 +-
components/menu/src/SubMenu.vue | 161 +++++++++++++++++----------
components/menu/src/SubPopupMenu.vue | 2 +-
components/trigger/Popup.vue | 15 ++-
components/trigger/index.vue | 66 ++++++-----
12 files changed, 213 insertions(+), 176 deletions(-)
diff --git a/components/_util/BaseMixin.js b/components/_util/BaseMixin.js
index 66d6bfa94..7c3206312 100644
--- a/components/_util/BaseMixin.js
+++ b/components/_util/BaseMixin.js
@@ -8,8 +8,14 @@ export default {
},
__emit () { // 直接调用listeners,底层组件不需要vueTool记录events
const args = [].slice.call(arguments, 0)
- if (args.length && this.$listeners[args[0]]) {
- this.$listeners[args[0]](...args.slice(1))
+ const filterEvent = []
+ const eventName = args[0]
+ if (args.length && this.$listeners[eventName]) {
+ if (filterEvent.includes(eventName)) {
+ this.$emit(eventName, ...args.slice(1))
+ } else {
+ this.$listeners[eventName](...args.slice(1))
+ }
}
},
},
diff --git a/components/_util/vnode.js b/components/_util/vnode.js
index ecf245b82..64784e1bf 100644
--- a/components/_util/vnode.js
+++ b/components/_util/vnode.js
@@ -1,34 +1,9 @@
-import clonedeep from 'lodash.clonedeep'
-// export function cloneVNode (vnode, deep) {
-// const cloned = new vnode.constructor(
-// vnode.tag,
-// clonedeep(vnode.data),
-// vnode.children,
-// vnode.text,
-// vnode.elm,
-// vnode.context,
-// clonedeep(vnode.componentOptions),
-// vnode.asyncFactory
-// )
-// cloned.ns = vnode.ns
-// cloned.isStatic = vnode.isStatic
-// cloned.key = vnode.key
-// cloned.isComment = vnode.isComment
-// cloned.isCloned = true
-// if (deep && vnode.children) {
-// cloned.children = cloneVNodes(vnode.children, deep)
-// }
-// return cloned
-// }
+import cloneDeep from 'lodash.clonedeep'
export function cloneVNode (vnode, deep) {
const componentOptions = vnode.componentOptions
- // if (componentOptions) {
- // componentOptions.propsData = componentOptions.propsData ? clonedeep(componentOptions.propsData) : componentOptions.propsData
- // }
-
const cloned = new vnode.constructor(
vnode.tag,
- clonedeep(vnode.data),
+ vnode.data,
vnode.children,
vnode.text,
vnode.elm,
@@ -66,21 +41,25 @@ export function cloneVNodes (vnodes, deep) {
export function cloneElement (n, nodeProps, clone) {
const node = clone ? cloneVNode(n, true) : n
- const { props = {}, key, on = {}} = nodeProps
- if (node.componentOptions) {
- node.componentOptions.propsData = node.componentOptions.propsData || {}
- node.componentOptions.listeners = node.componentOptions.listeners || {}
- Object.assign(node.componentOptions.propsData, props)
- Object.assign(node.componentOptions.listeners, on)
- }
-
+ const { props = {}, key, on = {}, addChildren } = nodeProps
const data = node.data || {}
const { style = data.style,
class: cls = data.class,
attrs = data.attrs,
ref,
} = nodeProps
- node.data = Object.assign(data, { style, attrs, class: cls, on: { ...(data.on || {}), ...on }})
+ node.data = Object.assign(data, { style, attrs, class: cls })
+ if (node.componentOptions) {
+ node.componentOptions.propsData = node.componentOptions.propsData || {}
+ node.componentOptions.listeners = node.componentOptions.listeners || {}
+ node.componentOptions.propsData = { ...node.componentOptions.propsData, ...props }
+ node.componentOptions.listeners = { ...node.componentOptions.listeners, ...on }
+ addChildren && node.componentOptions.children.push(addChildren)
+ } else {
+ addChildren && (node.children = [...(node.children || []), addChildren])
+ node.data.on = { ...(node.data.on || {}), ...on }
+ }
+
if (key !== undefined) {
node.key = key
node.data.key = key
@@ -105,3 +84,17 @@ export function getClass (ele) {
export function getStyle (ele) {
return ele.data && (ele.data.style || ele.data.staticStyle)
}
+
+export function filterEmpty (children = []) {
+ return children.filter(c => c.tag || c.text.trim() !== '')
+}
+
+export function getEvents (child) {
+ let events = {}
+ if (child.componentOptions && child.componentOptions.listeners) {
+ events = child.componentOptions.listeners
+ } else if (child.data && child.data.on) {
+ events = child.data.on
+ }
+ return events
+}
diff --git a/components/menu/MenuItem.vue b/components/menu/MenuItem.vue
index 006d9f049..a7e6c39c2 100644
--- a/components/menu/MenuItem.vue
+++ b/components/menu/MenuItem.vue
@@ -2,6 +2,7 @@
import { Item, itemProps } from './src/index'
import { getClass, getStyle } from '../_util/vnode'
import Tooltip from '../tooltip'
+import { getComponentFromProp } from '../_util/props-util'
export default {
props: itemProps,
@@ -14,7 +15,7 @@ export default {
this.$refs.menuItem.onKeyDown(e)
},
},
- render () {
+ render (h) {
const { inlineCollapsed, $props: props, $slots, $attrs: attrs, $listeners } = this
const itemProps = {
props,
diff --git a/components/menu/demo/antd.vue b/components/menu/demo/antd.vue
index e1083b02e..d8ab12e58 100644
--- a/components/menu/demo/antd.vue
+++ b/components/menu/demo/antd.vue
@@ -76,7 +76,7 @@ export default {
console.log('onOpenChange', value, this.$refs)
}
const commonMenu = () => (
-