From 3b9e63d587d3aeaa65bed1e0dcbd0bf516c366c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90?= Date: Wed, 6 Oct 2021 19:34:32 +0800 Subject: [PATCH] refactor(components): refactor space (#3757) --- .../components/space/__tests__/space.spec.ts | 2 +- packages/components/space/index.ts | 16 +- packages/components/space/src/index.ts | 143 ------------ packages/components/space/src/item.vue | 22 +- packages/components/space/src/space.ts | 208 ++++++++++++++++++ packages/components/space/src/use-space.ts | 84 +++++++ packages/components/space/src/useSpace.ts | 147 ------------- packages/utils/props.ts | 2 +- packages/utils/util.ts | 4 +- packages/utils/vnode.ts | 8 +- 10 files changed, 320 insertions(+), 316 deletions(-) delete mode 100644 packages/components/space/src/index.ts create mode 100644 packages/components/space/src/space.ts create mode 100644 packages/components/space/src/use-space.ts delete mode 100644 packages/components/space/src/useSpace.ts diff --git a/packages/components/space/__tests__/space.spec.ts b/packages/components/space/__tests__/space.spec.ts index 15f8122799..a7fa86fe9f 100644 --- a/packages/components/space/__tests__/space.spec.ts +++ b/packages/components/space/__tests__/space.spec.ts @@ -1,6 +1,6 @@ import { nextTick, h } from 'vue' import { mount } from '@vue/test-utils' -import Space from '../src/index' +import Space from '../src/space' const AXIOM = 'Rem is the best girl' diff --git a/packages/components/space/index.ts b/packages/components/space/index.ts index dacc06bb32..2d9b9f8b89 100644 --- a/packages/components/space/index.ts +++ b/packages/components/space/index.ts @@ -1,13 +1,9 @@ -import Space from './src/index' +import { withInstall } from '@element-plus/utils/with-install' -import type { App } from 'vue' -import type { SFCWithInstall } from '@element-plus/utils/types' +import Space from './src/space' -const _Space = Space as SFCWithInstall +export const ElSpace = withInstall(Space) +export default ElSpace -_Space.install = (app: App) => { - app.component(_Space.name, _Space) -} - -export default _Space -export const ElSpace = _Space +export * from './src/space' +export * from './src/use-space' diff --git a/packages/components/space/src/index.ts b/packages/components/space/src/index.ts deleted file mode 100644 index 0d5117dca0..0000000000 --- a/packages/components/space/src/index.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { - defineComponent, - renderSlot, - createVNode, - createTextVNode, - isVNode, -} from 'vue' -import { - PatchFlags, - isFragment, - isValidElementNode, -} from '@element-plus/utils/vnode' -import { isArray } from '@element-plus/utils/util' -import Item from './item.vue' -import { useSpace, defaultProps } from './useSpace' - -import type { VNode, ExtractPropTypes, Slots } from 'vue' - -export default defineComponent({ - name: 'ElSpace', - props: defaultProps, - setup(props) { - return useSpace(props) - }, - - render( - ctx: ReturnType & - ExtractPropTypes & { $slots: Slots } - ) { - const { - classes, - $slots, - containerStyle, - itemStyle, - spacer, - prefixCls, - direction, - } = ctx - - const children = renderSlot($slots, 'default', { key: 0 }, () => []) - // retrieve the children out via a simple for loop - // the edge case here is that when users uses directives like , - // we need to go one layer deeper - - if (children.children.length === 0) return null - - // loop the children, if current children is rendered via `renderList` or `` - if (isArray(children.children)) { - let extractedChildren = [] - children.children.forEach((child: VNode, loopKey) => { - if (isFragment(child)) { - if (isArray(child.children)) { - child.children.forEach((nested, key) => { - extractedChildren.push( - createVNode( - Item, - { - style: itemStyle, - prefixCls, - key: `nested-${key}`, - }, - { - default: () => [nested as VNode], - }, - PatchFlags.PROPS | PatchFlags.STYLE, - ['style', 'prefixCls'] - ) - ) - }) - } - // if the current child is valid vnode, then append this current vnode - // to item as child node. - } else if (isValidElementNode(child)) { - extractedChildren.push( - createVNode( - Item, - { - style: itemStyle, - prefixCls, - key: `LoopKey${loopKey}`, - }, - { - default: () => [child as VNode], - }, - PatchFlags.PROPS | PatchFlags.STYLE, - ['style', 'prefixCls'] - ) - ) - } - }) - - if (spacer) { - // track the current rendering index, when encounters the last element - // then no need to add a spacer after it. - const len = extractedChildren.length - 1 - extractedChildren = extractedChildren.reduce((acc, child, idx) => { - return idx === len - ? [...acc, child] - : [ - ...acc, - child, - createVNode( - 'span', - // adding width 100% for vertical alignment, - // when the spacer inherit the width from the - // parent, this span's width was not set, so space - // might disappear - { - style: [ - itemStyle, - direction === 'vertical' ? 'width: 100%' : null, - ], - key: idx, - }, - [ - // if spacer is already a valid vnode, then append it to the current - // span element. - // otherwise, treat it as string. - isVNode(spacer) - ? spacer - : createTextVNode(spacer as string, PatchFlags.TEXT), - ], - PatchFlags.STYLE - ), - ] - }, []) - } - - // spacer container. - return createVNode( - 'div', - { - class: classes, - style: containerStyle, - }, - extractedChildren, - PatchFlags.STYLE | PatchFlags.CLASS - ) - } - - return children.children - }, -}) diff --git a/packages/components/space/src/item.vue b/packages/components/space/src/item.vue index 40c58e3b1b..3ed2ab3ffe 100644 --- a/packages/components/space/src/item.vue +++ b/packages/components/space/src/item.vue @@ -1,22 +1,28 @@