antd3.0 table新增了components属性,用于覆盖默认table元素,官方更新日志上只提供了简答的配置,没有详细的元素使用方式,自己写了个如下,单没有起作用
import React from 'react';
import { Table } from 'antd';
export class TestTable extends React.Component {
constructor() {
super();
this.state = {
components: {
table: MyTable,
header: {
wrapper: HeaderWrapper,
row: HeaderRow,
cell: HeaderCell,
},
body: {
wrapper: BodyWrapper,
row: BodyRow,
cell: BodyCell,
},
},
dataSource:[{
key: '1',
name: '胡彦斌',
age: 32,
address: '西湖区湖底公园1号'
}, {
key: '2',
name: '胡彦祖',
age: 42,
address: '西湖区湖底公园1号'
}],
columns: [{
title: '姓名',
dataIndex: 'name',
key: 'name',
}, {
title: '年龄',
dataIndex: 'age',
key: 'age',
}, {
title: '住址',
dataIndex: 'address',
key: 'address',
}]
}
}
componentWillMount() {
}
componentWillUnmount() {
}
render() {
const { components, columns, dataSource } = this.state;
return (
<Table components={components} columns={columns} dataSource={dataSource}/>
);
}
}
const MyTable = () => <div></div>;
const HeaderWrapper = () => <div></div>;
const HeaderRow = () => <div></div>;
const HeaderCell = () => <div></div>;
const BodyWrapper = () => <div></div>;
const BodyRow = () => <div></div>;
const BodyCell = () => <div></div>;
刚看了
Table
的源码,antd
在上层预留了这个接口,判断逻辑也写好了,可惜在底层组件里我没找相关的支持。我的结论是目前这个功能是不可用的。如有我遗漏的地方还请
antd
团队成员指出。一会补充一个简短的源码分析
=========简要分析============
查看
Table
组件的代码,发现在初始化的时候会调用createComponents
方法可以看到,这个方法最终在
this.components
上设置了一个components
对象。图中if的两个布尔值,!this.components
对应组件挂载,bodyRow !== preBodyRow
对应的是componentWillReceiveProps
的情况,因为有可能改变传入的components
。this.components
会在render
方法中使用RcTable
是Table
的底层组件,antd
大部分组件都是这个形式,基本功能都是由底层组件实现的。找到
RcTable
的源码,发现components
在getChildContext
中被调用了然而
getChildContext
并没有在任何地方被调用。看起来路走到头了,然而还有一种可能,components
通过剩余参数传进子组件了。于是我们找到了相关代码根据代码,我们找到
ExpandableTable
组件注意红圈处,这表明最终传进
TableRow
的是一个预设对象,与我们传入的components
没有任何关系。这也就是我说的没有底层组件的支持。前面经过一系列传递的components
,就在这里断掉了。因此我认为这个属性是没作用的另外,关于
components
的写法,因为antd
用ts
写的,所以可以找到component
的接口定义再结合最后一步的预设
components
以及最重要的,TableRow中的代码:
可以看出,传进去的
tr
和td
最终是被当成组件使用的,这也是供用户自定义的地方