From 01d2a8182a2766b9b87e6c629fc137b1d55e1bde Mon Sep 17 00:00:00 2001 From: wangyupei <2311595895@qq.com> Date: Sat, 26 Mar 2022 11:53:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(Table):=20=E4=BD=BF=E7=94=A8Rem=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E4=BF=AE=E6=94=B9Table=E7=BB=84=E4=BB=B6=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devui/table/src/components/body/body.scss | 48 +++++++------- .../devui/table/src/components/body/body.tsx | 11 ++-- .../devui/table/src/components/fix-header.tsx | 15 +++-- .../table/src/components/header/header.scss | 66 ++++++++++--------- .../table/src/components/header/header.tsx | 16 ++--- .../devui/table/src/composable/use-table.ts | 15 +++-- packages/devui-vue/devui/table/src/table.scss | 42 ++++++------ packages/devui-vue/devui/table/src/table.tsx | 6 +- .../devui-vue/docs/components/table/index.md | 2 +- 9 files changed, 117 insertions(+), 104 deletions(-) diff --git a/packages/devui-vue/devui/table/src/components/body/body.scss b/packages/devui-vue/devui/table/src/components/body/body.scss index 22adac91ad..b11c2bb875 100644 --- a/packages/devui-vue/devui/table/src/components/body/body.scss +++ b/packages/devui-vue/devui/table/src/components/body/body.scss @@ -1,34 +1,38 @@ @import '../../../../styles-var/devui-var.scss'; -.devui-tbody { - tr { - font-size: $devui-font-size-card-title; - color: $devui-text; - border: none; - border-bottom: 1px solid $devui-dividing-line; - background-color: $devui-base-bg; +.devui-table { + &__tbody { + tr { + font-size: $devui-font-size-card-title; + color: $devui-text; + border: none; + border-bottom: 1px solid $devui-dividing-line; + background-color: $devui-base-bg; - &.hover-enabled:hover { - background-color: $devui-list-item-hover-bg; - } + &.hover-enabled:hover { + background-color: $devui-list-item-hover-bg; + } - td { - padding: 10px; - border: none; + td { + padding: 10px; + border: none; + } } } } -.devui-sticky-cell { - position: sticky; - z-index: 5; - background-color: inherit; +.devui-table { + &--sticky-cell { + position: sticky; + z-index: 5; + background-color: inherit; - &.left { - box-shadow: rgba(0, 0, 0, 0.05) $devui-shadow-length-slide-right; - } + &.left { + box-shadow: rgba(0, 0, 0, 0.05) $devui-shadow-length-slide-right; + } - &.right { - box-shadow: rgba(0, 0, 0, 0.05) $devui-shadow-length-slide-left; + &.right { + box-shadow: rgba(0, 0, 0, 0.05) $devui-shadow-length-slide-left; + } } } diff --git a/packages/devui-vue/devui/table/src/components/body/body.tsx b/packages/devui-vue/devui/table/src/components/body/body.tsx index af6349e5a8..3780f6e548 100644 --- a/packages/devui-vue/devui/table/src/components/body/body.tsx +++ b/packages/devui-vue/devui/table/src/components/body/body.tsx @@ -1,16 +1,17 @@ import { defineComponent, inject, computed, PropType, toRef } from 'vue'; import { TABLE_TOKEN } from '../../table-types'; -import { Checkbox } from '../../../../checkbox'; - -import './body.scss'; import { Column } from '../column/column-types'; +import { Checkbox } from '../../../../checkbox'; import { useFixedColumn } from '../../composable/use-table'; +import { useNamespace } from '../../../../shared/hooks/use-namespace'; +import './body.scss'; export default defineComponent({ name: 'DTableBody', setup() { const table = inject(TABLE_TOKEN); const { _data: data, _columns: columns, _checkList: checkList, isFixedLeft } = table.store.states; + const ns = useNamespace('table'); // 移动到行上是否高亮 const hoverEnabled = computed(() => table.props.rowHoveredHighlight); @@ -19,7 +20,7 @@ export default defineComponent({ const tdAttrs = computed(() => isFixedLeft.value ? { - class: 'devui-sticky-cell left', + class: `${ns.m('sticky-cell')} left`, style: 'left:0;', } : null @@ -32,7 +33,7 @@ export default defineComponent({ ) : null; return () => ( - + {data.value.map((row, rowIndex) => { return ( diff --git a/packages/devui-vue/devui/table/src/components/fix-header.tsx b/packages/devui-vue/devui/table/src/components/fix-header.tsx index 90061c33ed..cb5a527e5b 100644 --- a/packages/devui-vue/devui/table/src/components/fix-header.tsx +++ b/packages/devui-vue/devui/table/src/components/fix-header.tsx @@ -2,6 +2,7 @@ import { defineComponent } from 'vue'; import ColGroup from './colgroup/colgroup'; import TableHeader from './header/header'; import TableBody from './body/body'; +import { useNamespace } from '../../../shared/hooks/use-namespace'; export default defineComponent({ props: { @@ -14,19 +15,21 @@ export default defineComponent({ }, }, setup(props: { classes: Record; isEmpty: boolean }) { + const ns = useNamespace('table'); + return () => { return ( -
-
- +
+
+
-
- +
+
- {!props.isEmpty && } + {!props.isEmpty && }
diff --git a/packages/devui-vue/devui/table/src/components/header/header.scss b/packages/devui-vue/devui/table/src/components/header/header.scss index e7b9fddb44..21354df112 100644 --- a/packages/devui-vue/devui/table/src/components/header/header.scss +++ b/packages/devui-vue/devui/table/src/components/header/header.scss @@ -1,44 +1,48 @@ @import '../../../../styles-var/devui-var.scss'; -.devui-thead { - tr { - font-size: $devui-font-size-card-title; - color: $devui-text; - font-weight: 700; - border: none; - border-bottom: 1px solid $devui-line; - background-color: $devui-base-bg; - - th { - text-align: left; - padding: 0; +.devui-table { + &__thead { + tr { + font-size: $devui-font-size-card-title; + color: $devui-text; + font-weight: 700; border: none; + border-bottom: 1px solid $devui-line; + background-color: $devui-base-bg; + + th { + text-align: left; + padding: 0; + border: none; + } } - } - .header-container { - position: relative; - display: flex; - align-items: center; - padding-left: 2px; - padding-right: 8px; + .header-container { + position: relative; + display: flex; + align-items: center; + padding-left: 2px; + padding-right: 8px; - .title { - display: inline-block; - line-height: 36px; - vertical-align: middle; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - cursor: default; + .title { + display: inline-block; + line-height: 36px; + vertical-align: middle; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + cursor: default; + } } } } -.header-bg { - thead.devui-thead { - tr { - background: var(--devui-list-item-hover-bg, #f2f5fc); +.devui-table { + &--header-bg { + thead.devui-thead { + tr { + background: var(--devui-list-item-hover-bg, #f2f5fc); + } } } } diff --git a/packages/devui-vue/devui/table/src/components/header/header.tsx b/packages/devui-vue/devui/table/src/components/header/header.tsx index 01d56859c0..a5b0d7ba29 100644 --- a/packages/devui-vue/devui/table/src/components/header/header.tsx +++ b/packages/devui-vue/devui/table/src/components/header/header.tsx @@ -1,26 +1,26 @@ import { defineComponent, inject, computed, PropType, toRefs } from 'vue'; import { TABLE_TOKEN } from '../../table-types'; import { Column } from '../column/column-types'; - import { Checkbox } from '../../../../checkbox'; import { Sort } from '../sort'; import { Filter } from '../filter'; - -import './header.scss'; -import '../body/body.scss'; import { useFliter, useSort } from './use-header'; import { useFixedColumn } from '../../composable/use-table'; +import { useNamespace } from '../../../../shared/hooks/use-namespace'; +import './header.scss'; +import '../body/body.scss'; export default defineComponent({ name: 'DTableHeader', setup() { const table = inject(TABLE_TOKEN); const { _checkAll: checkAll, _halfChecked: halfChecked, _columns: columns, isFixedLeft } = table.store.states; + const ns = useNamespace('table'); const thAttrs = computed(() => isFixedLeft.value ? { - class: 'devui-sticky-cell left', + class: `${ns.m('sticky-cell')} left`, style: 'left:0;', } : null @@ -28,14 +28,14 @@ export default defineComponent({ const checkbox = computed(() => table.props.checkable ? ( - + ) : null ); return () => { return ( - + {checkbox.value} {columns.value.map((column, index) => ( @@ -70,7 +70,7 @@ const Th = defineComponent({ return () => ( -
+
{props.column.renderHeader()} {props.column.filterable && ( diff --git a/packages/devui-vue/devui/table/src/composable/use-table.ts b/packages/devui-vue/devui/table/src/composable/use-table.ts index 43fdfdaaed..c9b172a4b4 100644 --- a/packages/devui-vue/devui/table/src/composable/use-table.ts +++ b/packages/devui-vue/devui/table/src/composable/use-table.ts @@ -1,6 +1,7 @@ import { computed, ComputedRef, CSSProperties, Ref, ToRefs } from 'vue'; import { Column } from '../components/column/column-types'; import { TablePropsTypes } from '../table-types'; +import { useNamespace } from '../../../shared/hooks/use-namespace'; interface TableConfig { classes: ComputedRef>; @@ -8,11 +9,12 @@ interface TableConfig { } export function useTable(props: TablePropsTypes): TableConfig { + const ns = useNamespace('table'); const classes = computed(() => ({ - 'devui-table': true, - 'devui-table-striped': props.striped, - 'header-bg': props.headerBg, - 'table-layout-auto': props.tableLayout === 'auto', + [ns.e('view')]: true, + [ns.m('striped')]: props.striped, + [ns.m('header-bg')]: props.headerBg, + [ns.m('layout-auto')]: props.tableLayout === 'auto', })); const style: ComputedRef = computed(() => ({ maxHeight: props.maxHeight, @@ -24,14 +26,15 @@ export function useTable(props: TablePropsTypes): TableConfig { } export const useFixedColumn = (column: Ref): ToRefs<{ stickyCell: string; offsetStyle: string }> => { + const ns = useNamespace('table'); const stickyCell = computed(() => { const col = column.value; if (col.fixedLeft) { - return `devui-sticky-cell left`; + return `${ns.m('sticky-cell')} left`; } if (col.fixedRight) { - return `devui-sticky-cell right`; + return `${ns.m('sticky-cell')} right`; } return undefined; }); diff --git a/packages/devui-vue/devui/table/src/table.scss b/packages/devui-vue/devui/table/src/table.scss index 125f13cc1f..c0f24c0953 100644 --- a/packages/devui-vue/devui/table/src/table.scss +++ b/packages/devui-vue/devui/table/src/table.scss @@ -1,49 +1,45 @@ @import '../../styles-var/devui-var.scss'; .devui-table { - display: table; - table-layout: fixed; width: 100%; - border-spacing: 0; - border: none; - margin: 0; - padding: 0; + overflow-x: auto; + padding-top: 8px; - &-wrapper { + &__view { + display: table; + table-layout: fixed; width: 100%; - overflow-x: auto; - padding-top: 8px; + border-spacing: 0; + border: none; + margin: 0; + padding: 0; } - &-striped { + &--striped { tbody tr:nth-child(even) { background-color: $devui-list-item-strip-bg; } } - &-empty { + &__empty { width: 100%; font-size: $devui-font-size; text-align: center; } - &-view { + &__fix-header { display: flex; flex-direction: column; position: relative; height: 100%; - - & .scroll-view { - flex: 1; - overflow: scroll; - } } -} -.table-layout-auto { - table-layout: auto; -} + &__scroll-view { + flex: 1; + overflow: scroll; + } -.table-layout-auto { - table-layout: auto; + &--layout-auto { + table-layout: auto; + } } diff --git a/packages/devui-vue/devui/table/src/table.tsx b/packages/devui-vue/devui/table/src/table.tsx index bb091d4fdc..31caddb16e 100644 --- a/packages/devui-vue/devui/table/src/table.tsx +++ b/packages/devui-vue/devui/table/src/table.tsx @@ -5,6 +5,7 @@ import { createStore } from './store'; import FixHeader from './components/fix-header'; import NormalHeader from './components/normal-header'; import { Loading } from '../../loading'; +import { useNamespace } from '../../shared/hooks/use-namespace'; import './table.scss'; export default defineComponent({ @@ -20,6 +21,7 @@ export default defineComponent({ provide(TABLE_TOKEN, table); const { classes, style } = useTable(props); const isEmpty = computed(() => props.data.length === 0); + const ns = useNamespace('table'); ctx.expose({ getCheckedRows() { @@ -28,14 +30,14 @@ export default defineComponent({ }); return () => ( -
+
{ctx.slots.default?.()} {props.fixHeader ? ( ) : ( )} - {isEmpty.value &&
No Data
} + {isEmpty.value &&
No Data
}
); }, diff --git a/packages/devui-vue/docs/components/table/index.md b/packages/devui-vue/docs/components/table/index.md index 73e23e56e6..4087da3215 100644 --- a/packages/devui-vue/docs/components/table/index.md +++ b/packages/devui-vue/docs/components/table/index.md @@ -226,7 +226,7 @@ export default defineComponent({
更新数据 - +