You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.7 KiB
75 lines
1.7 KiB
import * as React from 'react';
|
|
import classnames from 'classnames';
|
|
import omit from 'omit.js';
|
|
import { Store } from './createStore';
|
|
|
|
interface BodyRowProps {
|
|
store: Store;
|
|
className?: string;
|
|
rowKey: string;
|
|
prefixCls: string;
|
|
}
|
|
|
|
interface BodyRowState {
|
|
selected: boolean;
|
|
}
|
|
|
|
export interface BodyRowClass extends React.ComponentClass {}
|
|
|
|
export default function createBodyRow(Component: React.ReactType = 'tr') {
|
|
class BodyRow extends React.Component<BodyRowProps, BodyRowState> {
|
|
private store: Store;
|
|
|
|
private unsubscribe: () => void;
|
|
|
|
constructor(props: BodyRowProps) {
|
|
super(props);
|
|
|
|
this.store = props.store;
|
|
const { selectedRowKeys } = this.store.getState();
|
|
|
|
this.state = {
|
|
selected: selectedRowKeys.indexOf(props.rowKey) >= 0,
|
|
};
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.subscribe();
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
if (this.unsubscribe) {
|
|
this.unsubscribe();
|
|
}
|
|
}
|
|
|
|
subscribe() {
|
|
const { store, rowKey } = this.props;
|
|
this.unsubscribe = store.subscribe(() => {
|
|
const { selectedRowKeys } = this.store.getState();
|
|
const selected = selectedRowKeys.indexOf(rowKey) >= 0;
|
|
if (selected !== this.state.selected) {
|
|
this.setState({ selected });
|
|
}
|
|
});
|
|
}
|
|
|
|
render() {
|
|
const rowProps = omit(this.props, ['prefixCls', 'rowKey', 'store']);
|
|
const className = classnames(this.props.className, {
|
|
[`${this.props.prefixCls}-row-selected`]: this.state.selected,
|
|
});
|
|
|
|
return React.createElement(
|
|
Component,
|
|
{
|
|
...rowProps,
|
|
className,
|
|
},
|
|
this.props.children,
|
|
);
|
|
}
|
|
}
|
|
|
|
return BodyRow as BodyRowClass;
|
|
}
|
|
|