@@ -114,14 +111,7 @@ export default {
key="bodyTable"
class={`${prefixCls}-body`}
style={bodyStyle}
- {...{
- directives: [
- {
- name: 'ant-ref',
- value: saveRef('bodyTable'),
- },
- ],
- }}
+ ref={saveRef('bodyTable')}
onWheel={handleWheel}
onScroll={handleBodyScroll}
>
diff --git a/components/vc-table/src/ColGroup.jsx b/components/vc-table/src/ColGroup.jsx
index b5d876019..0a2c1e996 100644
--- a/components/vc-table/src/ColGroup.jsx
+++ b/components/vc-table/src/ColGroup.jsx
@@ -1,14 +1,18 @@
+import { inject } from 'vue';
import PropTypes from '../../_util/vue-types';
import { INTERNAL_COL_DEFINE } from './utils';
export default {
name: 'ColGroup',
+ inheritAttrs: false,
props: {
fixed: PropTypes.string,
columns: PropTypes.array,
},
- inject: {
- table: { default: () => ({}) },
+ setup() {
+ return {
+ table: inject('table', {}),
+ };
},
render() {
const { fixed, table } = this;
diff --git a/components/vc-table/src/Column.jsx b/components/vc-table/src/Column.jsx
index 751a085d6..2e10b602c 100644
--- a/components/vc-table/src/Column.jsx
+++ b/components/vc-table/src/Column.jsx
@@ -1,20 +1,24 @@
-import PropTypes from '../../_util/vue-types';
+// import PropTypes from '../../_util/vue-types';
-export default {
- name: 'Column',
- props: {
- rowSpan: PropTypes.number,
- colSpan: PropTypes.number,
- title: PropTypes.any,
- dataIndex: PropTypes.string,
- width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
- ellipsis: PropTypes.bool,
- fixed: PropTypes.oneOf([true, 'left', 'right']),
- align: PropTypes.oneOf(['left', 'center', 'right']),
- customRender: PropTypes.func,
- className: PropTypes.string,
- // onCellClick: PropTypes.func,
- customCell: PropTypes.func,
- customHeaderCell: PropTypes.func,
- },
-};
+// export default {
+// name: 'Column',
+// props: {
+// rowSpan: PropTypes.number,
+// colSpan: PropTypes.number,
+// title: PropTypes.any,
+// dataIndex: PropTypes.string,
+// width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
+// ellipsis: PropTypes.bool,
+// fixed: PropTypes.oneOf([true, 'left', 'right']),
+// align: PropTypes.oneOf(['left', 'center', 'right']),
+// customRender: PropTypes.func,
+// className: PropTypes.string,
+// // onCellClick: PropTypes.func,
+// customCell: PropTypes.func,
+// customHeaderCell: PropTypes.func,
+// },
+// };
+
+const Column = () => null;
+
+export default Column;
diff --git a/components/vc-table/src/ColumnGroup.jsx b/components/vc-table/src/ColumnGroup.jsx
index 920809dba..1b4821467 100644
--- a/components/vc-table/src/ColumnGroup.jsx
+++ b/components/vc-table/src/ColumnGroup.jsx
@@ -6,4 +6,7 @@ export default {
title: PropTypes.any,
},
isTableColumnGroup: true,
+ render() {
+ return null;
+ },
};
diff --git a/components/vc-table/src/ExpandIcon.jsx b/components/vc-table/src/ExpandIcon.jsx
index 346837d07..151ea685b 100644
--- a/components/vc-table/src/ExpandIcon.jsx
+++ b/components/vc-table/src/ExpandIcon.jsx
@@ -3,6 +3,7 @@ import BaseMixin from '../../_util/BaseMixin';
export default {
name: 'ExpandIcon',
mixins: [BaseMixin],
+ inheritAttrs: false,
props: {
record: PropTypes.object,
prefixCls: PropTypes.string,
diff --git a/components/vc-table/src/ExpandableRow.jsx b/components/vc-table/src/ExpandableRow.jsx
index 6e9cfcbb3..fa943934f 100644
--- a/components/vc-table/src/ExpandableRow.jsx
+++ b/components/vc-table/src/ExpandableRow.jsx
@@ -2,10 +2,12 @@ import PropTypes from '../../_util/vue-types';
import ExpandIcon from './ExpandIcon';
import BaseMixin from '../../_util/BaseMixin';
import { connect } from '../../_util/store';
+import { getSlot } from '../../_util/props-util';
const ExpandableRow = {
mixins: [BaseMixin],
name: 'ExpandableRow',
+ inheritAttrs: false,
props: {
prefixCls: PropTypes.string.isRequired,
rowKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
@@ -96,35 +98,22 @@ const ExpandableRow = {
},
render() {
- const {
- childrenColumnName,
- expandedRowRender,
- indentSize,
- record,
- fixed,
- $scopedSlots,
- expanded,
- } = this;
+ const { childrenColumnName, expandedRowRender, indentSize, record, fixed, expanded } = this;
this.tempExpandIconAsCell = fixed !== 'right' ? this.expandIconAsCell : false;
this.tempExpandIconColumnIndex = fixed !== 'right' ? this.expandIconColumnIndex : -1;
const childrenData = record[childrenColumnName];
this.expandable = !!(childrenData || expandedRowRender);
const expandableRowProps = {
- props: {
- indentSize,
- expanded, // not used in TableRow, but it's required to re-render TableRow when `expanded` changes
- hasExpandIcon: this.hasExpandIcon,
- renderExpandIcon: this.renderExpandIcon,
- renderExpandIconCell: this.renderExpandIconCell,
- },
-
- on: {
- rowClick: this.handleRowClick,
- },
+ indentSize,
+ expanded, // not used in TableRow, but it's required to re-render TableRow when `expanded` changes
+ hasExpandIcon: this.hasExpandIcon,
+ renderExpandIcon: this.renderExpandIcon,
+ renderExpandIconCell: this.renderExpandIconCell,
+ onRowClick: this.handleRowClick,
};
- return $scopedSlots.default && $scopedSlots.default(expandableRowProps);
+ return getSlot(this, 'default', expandableRowProps);
},
};
diff --git a/components/vc-table/src/ExpandableTable.jsx b/components/vc-table/src/ExpandableTable.jsx
index 6f75a1726..f418254b3 100644
--- a/components/vc-table/src/ExpandableTable.jsx
+++ b/components/vc-table/src/ExpandableTable.jsx
@@ -4,7 +4,7 @@ import { connect } from '../../_util/store';
import shallowEqual from 'shallowequal';
import TableRow from './TableRow';
import { remove } from './utils';
-import { initDefaultProps, getOptionProps, getListeners } from '../../_util/props-util';
+import { initDefaultProps, getOptionProps, getSlot } from '../../_util/props-util';
export const ExpandableTableProps = () => ({
expandIconAsCell: PropTypes.bool,
@@ -29,6 +29,7 @@ export const ExpandableTableProps = () => ({
const ExpandableTable = {
name: 'ExpandableTable',
+ inheritAttrs: false,
mixins: [BaseMixin],
props: initDefaultProps(ExpandableTableProps(), {
expandIconAsCell: false,
@@ -166,9 +167,7 @@ const ExpandableTable = {
const { expandedRowKeys } = this.store.getState();
const expanded = expandedRowKeys.includes(parentKey);
return {
- attrs: {
- colSpan: colCount,
- },
+ props: { colSpan: colCount },
children:
fixed !== 'right' ? expandedRowRender(record, index, indent, expanded) : ' ',
};
@@ -227,21 +226,18 @@ const ExpandableTable = {
},
render() {
- const { data, childrenColumnName, $scopedSlots } = this;
+ const { data, childrenColumnName } = this;
const props = getOptionProps(this);
const needIndentSpaced = data.some(record => record[childrenColumnName]);
- return (
- $scopedSlots.default &&
- $scopedSlots.default({
- props,
- on: getListeners(this),
- needIndentSpaced,
- renderRows: this.renderRows,
- handleExpandChange: this.handleExpandChange,
- renderExpandIndentCell: this.renderExpandIndentCell,
- })
- );
+ return getSlot(this, 'default', {
+ ...props,
+ ...this.$attrs,
+ needIndentSpaced,
+ renderRows: this.renderRows,
+ handleExpandChange: this.handleExpandChange,
+ renderExpandIndentCell: this.renderExpandIndentCell,
+ });
},
};
diff --git a/components/vc-table/src/HeadTable.jsx b/components/vc-table/src/HeadTable.jsx
index 29e3043b2..af640b1ac 100644
--- a/components/vc-table/src/HeadTable.jsx
+++ b/components/vc-table/src/HeadTable.jsx
@@ -1,3 +1,4 @@
+import { inject } from 'vue';
import PropTypes from '../../_util/vue-types';
import { measureScrollbar } from './utils';
import BaseTable from './BaseTable';
@@ -5,6 +6,7 @@ import classNames from 'classnames';
export default {
name: 'HeadTable',
+ inheritAttrs: false,
props: {
fixed: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
columns: PropTypes.array.isRequired,
@@ -12,8 +14,10 @@ export default {
handleBodyScrollLeft: PropTypes.func.isRequired,
expander: PropTypes.object.isRequired,
},
- inject: {
- table: { default: () => ({}) },
+ setup() {
+ return {
+ table: inject('table', {}),
+ };
},
render() {
const { columns, fixed, tableClassName, handleBodyScrollLeft, expander, table } = this;
@@ -45,14 +49,7 @@ export default {
return (
{} : saveRef('headTable'),
- },
- ],
- }}
+ ref={fixed ? () => {} : saveRef('headTable')}
class={classNames(`${prefixCls}-header`, {
[`${prefixCls}-hide-scrollbar`]: scrollbarWidth > 0,
})}
diff --git a/components/vc-table/src/Table.jsx b/components/vc-table/src/Table.jsx
index 0382fbb2e..e2dc9e9ab 100644
--- a/components/vc-table/src/Table.jsx
+++ b/components/vc-table/src/Table.jsx
@@ -1,10 +1,11 @@
/* eslint-disable camelcase */
+import { provide } from 'vue';
import shallowequal from 'shallowequal';
import merge from 'lodash/merge';
import classes from 'component-classes';
import classNames from 'classnames';
import PropTypes from '../../_util/vue-types';
-import { debounce } from './utils';
+import { debounce, getDataAndAriaProps } from './utils';
import warning from '../../_util/warning';
import addEventListener from '../../vc-util/Dom/addEventListener';
import { Provider, create } from '../../_util/store';
@@ -12,12 +13,13 @@ import ColumnManager from './ColumnManager';
import HeadTable from './HeadTable';
import BodyTable from './BodyTable';
import ExpandableTable from './ExpandableTable';
-import { initDefaultProps, getOptionProps, getListeners } from '../../_util/props-util';
+import { initDefaultProps, getOptionProps } from '../../_util/props-util';
import BaseMixin from '../../_util/BaseMixin';
export default {
name: 'Table',
mixins: [BaseMixin],
+ inheritAttrs: false,
props: initDefaultProps(
{
data: PropTypes.array,
@@ -41,7 +43,7 @@ export default {
emptyText: PropTypes.any,
scroll: PropTypes.object,
rowRef: PropTypes.func,
- getBodyWrapper: PropTypes.func,
+ // getBodyWrapper: PropTypes.func,
components: PropTypes.shape({
table: PropTypes.any,
header: PropTypes.shape({
@@ -144,19 +146,20 @@ export default {
// },
created() {
- ['rowClick', 'rowDoubleclick', 'rowContextmenu', 'rowMouseenter', 'rowMouseleave'].forEach(
- name => {
- warning(
- getListeners(this)[name] === undefined,
- `${name} is deprecated, please use customRow instead.`,
- );
- },
- );
+ provide('table', this);
+ // ['rowClick', 'rowDoubleclick', 'rowContextmenu', 'rowMouseenter', 'rowMouseleave'].forEach(
+ // name => {
+ // warning(
+ // getListeners(this)[name] === undefined,
+ // `${name} is deprecated, please use customRow instead.`,
+ // );
+ // },
+ // );
- warning(
- this.getBodyWrapper === undefined,
- 'getBodyWrapper is deprecated, please use custom components instead.',
- );
+ // warning(
+ // this.getBodyWrapper === undefined,
+ // 'getBodyWrapper is deprecated, please use custom components instead.',
+ // );
// this.columnManager = new ColumnManager(this.columns, this.$slots.default)
@@ -541,11 +544,11 @@ export default {
},
render() {
- const props = getOptionProps(this);
+ const props = { ...getOptionProps(this), ...this.$attrs };
const { columnManager, getRowKey } = this;
const prefixCls = props.prefixCls;
- const tableClassName = classNames(props.prefixCls, {
+ const tableClassName = classNames(props.prefixCls, props.class, {
[`${prefixCls}-fixed-header`]: props.useFixedHeader || (props.scroll && props.scroll.y),
[`${prefixCls}-scroll-position-left ${prefixCls}-scroll-position-right`]:
this.scrollPosition === 'both',
@@ -555,45 +558,38 @@ export default {
const hasLeftFixed = columnManager.isAnyColumnsLeftFixed();
const hasRightFixed = columnManager.isAnyColumnsRightFixed();
-
+ const dataAndAriaProps = getDataAndAriaProps(props);
const expandableTableProps = {
- props: {
- ...props,
- columnManager,
- getRowKey,
- },
- on: getListeners(this),
- scopedSlots: {
- default: expander => {
- this.expander = expander;
- return (
-
- {this.renderTitle()}
-
- {this.renderMainTable()}
- {hasLeftFixed && this.renderLeftFixedTable()}
- {hasRightFixed && this.renderRightFixedTable()}
-
-
- );
- },
- },
+ ...props,
+ columnManager,
+ getRowKey,
};
return (
-
+ {
+ this.expander = expander;
+ return (
+
+ {this.renderTitle()}
+
+ {this.renderMainTable()}
+ {hasLeftFixed && this.renderLeftFixedTable()}
+ {hasRightFixed && this.renderRightFixedTable()}
+
+
+ );
+ },
+ }}
+ />
);
},
diff --git a/components/vc-table/src/TableCell.jsx b/components/vc-table/src/TableCell.jsx
index b82dcf6ec..6dfa64a3c 100644
--- a/components/vc-table/src/TableCell.jsx
+++ b/components/vc-table/src/TableCell.jsx
@@ -1,7 +1,8 @@
+import { inject } from 'vue';
import PropTypes from '../../_util/vue-types';
import get from 'lodash/get';
import classNames from 'classnames';
-import { isValidElement, mergeProps } from '../../_util/props-util';
+import { isValidElement } from '../../_util/props-util';
function isInvalidRenderCellText(text) {
return (
@@ -11,6 +12,7 @@ function isInvalidRenderCellText(text) {
export default {
name: 'TableCell',
+ inheritAttrs: false,
props: {
record: PropTypes.object,
prefixCls: PropTypes.string,
@@ -21,8 +23,10 @@ export default {
expandIcon: PropTypes.any,
component: PropTypes.any,
},
- inject: {
- table: { default: () => ({}) },
+ setup() {
+ return {
+ table: inject('table', {}),
+ };
},
methods: {
handleClick(e) {
@@ -60,11 +64,7 @@ export default {
text = get(record, dataIndex);
}
let tdProps = {
- props: {},
- attrs: {},
- on: {
- click: this.handleClick,
- },
+ onClick: this.handleClick,
};
let colSpan;
let rowSpan;
@@ -72,18 +72,14 @@ export default {
if (customRender) {
text = customRender(text, record, index, column);
if (isInvalidRenderCellText(text)) {
- tdProps.attrs = text.attrs || {};
- tdProps.props = text.props || {};
- tdProps.class = text.class;
- tdProps.style = text.style;
- colSpan = tdProps.attrs.colSpan;
- rowSpan = tdProps.attrs.rowSpan;
+ tdProps = text.props || tdProps;
+ ({ colSpan, rowSpan } = tdProps);
text = text.children;
}
}
if (column.customCell) {
- tdProps = mergeProps(tdProps, column.customCell(record, index));
+ tdProps = { ...tdProps, ...column.customCell(record, index) };
}
// Fix https://github.com/ant-design/ant-design/issues/1202
@@ -118,7 +114,7 @@ export default {
if (column.ellipsis) {
if (typeof text === 'string') {
- tdProps.attrs.title = text;
+ tdProps.title = text;
} else if (text) {
// const { props: textProps } = text;
// if (textProps && textProps.children && typeof textProps.children === 'string') {
diff --git a/components/vc-table/src/TableHeader.jsx b/components/vc-table/src/TableHeader.jsx
index 2485f52be..cb83474d8 100644
--- a/components/vc-table/src/TableHeader.jsx
+++ b/components/vc-table/src/TableHeader.jsx
@@ -1,3 +1,4 @@
+import { inject } from 'vue';
import PropTypes from '../../_util/vue-types';
import TableHeaderRow from './TableHeaderRow';
@@ -42,13 +43,16 @@ function getHeaderRows({ columns = [], currentRow = 0, rows = [], isLast = true
export default {
name: 'TableHeader',
+ inheritAttrs: false,
props: {
fixed: PropTypes.string,
columns: PropTypes.array.isRequired,
expander: PropTypes.object.isRequired,
},
- inject: {
- table: { default: () => ({}) },
+ setup() {
+ return {
+ table: inject('table', {}),
+ };
},
render() {
diff --git a/components/vc-table/src/TableHeaderRow.jsx b/components/vc-table/src/TableHeaderRow.jsx
index 38c93f839..9d1037958 100644
--- a/components/vc-table/src/TableHeaderRow.jsx
+++ b/components/vc-table/src/TableHeaderRow.jsx
@@ -1,9 +1,10 @@
import classNames from 'classnames';
import PropTypes from '../../_util/vue-types';
import { connect } from '../../_util/store';
-import { mergeProps } from '../../_util/props-util';
const TableHeaderRow = {
+ name: 'TableHeaderRow',
+ inheritAttrs: false,
props: {
index: PropTypes.number,
fixed: PropTypes.string,
@@ -15,8 +16,7 @@ const TableHeaderRow = {
customHeaderRow: PropTypes.func,
prefixCls: PropTypes.prefixCls,
},
- name: 'TableHeaderRow',
- render(h) {
+ render() {
const { row, index, height, components, customHeaderRow, prefixCls } = this;
const HeaderRow = components.header.row;
const HeaderCell = components.header.cell;
@@ -34,17 +34,11 @@ const TableHeaderRow = {
{row.map((cell, i) => {
const { column, isLast, children, className, ...cellProps } = cell;
const customProps = column.customHeaderCell ? column.customHeaderCell(column) : {};
- const headerCellProps = mergeProps(
- {
- attrs: {
- ...cellProps,
- },
- },
- {
- ...customProps,
- key: column.key || column.dataIndex || i,
- },
- );
+ const headerCellProps = {
+ ...cellProps,
+ ...customProps,
+ key: column.key || column.dataIndex || i,
+ };
if (column.align) {
headerCellProps.style = { ...customProps.style, textAlign: column.align };
@@ -64,7 +58,7 @@ const TableHeaderRow = {
);
if (typeof HeaderCell === 'function') {
- return HeaderCell(h, headerCellProps, children);
+ return HeaderCell(headerCellProps, children);
}
return
{children};
})}
diff --git a/components/vc-table/src/TableRow.jsx b/components/vc-table/src/TableRow.jsx
index e15112a1f..0855bdccb 100644
--- a/components/vc-table/src/TableRow.jsx
+++ b/components/vc-table/src/TableRow.jsx
@@ -2,12 +2,13 @@ import classNames from 'classnames';
import PropTypes from '../../_util/vue-types';
import { connect } from '../../_util/store';
import TableCell from './TableCell';
-import { initDefaultProps, mergeProps, getStyle } from '../../_util/props-util';
+import { initDefaultProps, findDOMNode } from '../../_util/props-util';
import BaseMixin from '../../_util/BaseMixin';
import warning from '../../_util/warning';
function noop() {}
const TableRow = {
name: 'TableRow',
+ inheritAttrs: false,
mixins: [BaseMixin],
props: initDefaultProps(
{
@@ -140,7 +141,7 @@ const TableRow = {
getStyle() {
const { height, visible } = this;
- let style = getStyle(this);
+ let style = this.$attrs.style || {};
if (height) {
style = { ...style, height };
}
@@ -153,7 +154,7 @@ const TableRow = {
},
saveRowRef() {
- this.rowRef = this.$el;
+ this.rowRef = findDOMNode(this);
const { isAnyColumnsFixed, fixed, expandedRow, ancestorKeys } = this;
@@ -196,7 +197,7 @@ const TableRow = {
const BodyRow = components.body.row;
const BodyCell = components.body.cell;
- let className = '';
+ let className = this.$attrs.class || '';
if (hovered) {
className += ` ${prefixCls}-hover`;
@@ -246,35 +247,27 @@ const TableRow = {
customClassName,
customClass,
);
- const rowPropEvents = rowProps.on || {};
- const bodyRowProps = mergeProps(
- { ...rowProps, style },
- {
- on: {
- click: e => {
- this.onRowClick(e, rowPropEvents.click);
- },
- dblclick: e => {
- this.onRowDoubleClick(e, rowPropEvents.dblclick);
- },
- mouseenter: e => {
- this.onMouseEnter(e, rowPropEvents.mouseenter);
- },
- mouseleave: e => {
- this.onMouseLeave(e, rowPropEvents.mouseleave);
- },
- contextmenu: e => {
- this.onContextMenu(e, rowPropEvents.contextmenu);
- },
- },
- class: rowClassName,
+ const bodyRowProps = {
+ ...rowProps,
+ style,
+ onClick: e => {
+ this.onRowClick(e, rowProps.click);
},
- {
- attrs: {
- 'data-row-key': rowKey,
- },
+ onDblclick: e => {
+ this.onRowDoubleClick(e, rowProps.dblclick);
},
- );
+ onMouseenter: e => {
+ this.onMouseEnter(e, rowProps.mouseenter);
+ },
+ onMouseleave: e => {
+ this.onMouseLeave(e, rowProps.mouseleave);
+ },
+ onContextmenu: e => {
+ this.onContextMenu(e, rowProps.contextmenu);
+ },
+ class: rowClassName,
+ 'data-row-key': rowKey,
+ };
return
{cells};
},
};
diff --git a/components/vc-table/src/utils.js b/components/vc-table/src/utils.js
index 5d383027f..3fb659c27 100644
--- a/components/vc-table/src/utils.js
+++ b/components/vc-table/src/utils.js
@@ -85,3 +85,16 @@ export function remove(array, item) {
const last = array.slice(index + 1, array.length);
return front.concat(last);
}
+
+/**
+ * Returns only data- and aria- key/value pairs
+ * @param {object} props
+ */
+export function getDataAndAriaProps(props) {
+ return Object.keys(props).reduce((memo, key) => {
+ if (key.substr(0, 5) === 'data-' || key.substr(0, 5) === 'aria-') {
+ memo[key] = props[key];
+ }
+ return memo;
+ }, {});
+}