【发布时间】:2022-01-17 13:21:43
【问题描述】:
我有一个抽象类:
export default abstract class TableAction<T = any, R = any> extends React.Component<T, R> {
protected abstract onClick(e: React.MouseEvent<HTMLButtonElement>): void | Promise<void>;
protected abstract onMouseEnter(e: React.MouseEvent<HTMLButtonElement>): void | Promise<void>;
protected abstract onMouseLeave(e: React.MouseEvent<HTMLButtonElement>): void | Promise<void>;
protected abstract renderContent(): React.ReactElement;
public render = (): React.ReactElement => {
return (
<div onClick={() => this.onClick} onMouseEnter={() => this.onMouseEnter} onMouseLeave={() => this.onMouseLeave}>
{this.renderContent()}
</div>
);
}
}
一个实现:
export default class SendToMailTableAction extends TableAction<ISendToMailTableActionProps, ISendToMailTableActionState> {
protected onClick = async (e: React.MouseEvent<HTMLButtonElement>): Promise<void> => {
}
protected onMouseEnter = (e: React.MouseEvent<HTMLButtonElement>): void => {
}
protected onMouseLeave = (e: React.MouseEvent<HTMLButtonElement>): void => {
}
protected renderContent = (): React.ReactElement => {
return (
<button onClick={this.onClick}>
Send files to mail
</button>
);
}
}
还有一个“经理”接收React.ReactElement<TableActions>[](作为元素数组的抽象类)作为道具:
ITableActionsProps {
TableActions: React.ReactElement<TableAction>[];
}
export default class TableActions extends React.Component<ITableActionsProps, ITableActionsState> {
render() {
return (
<div>
</div>
);
}
我需要将所有这些类转换为函数组件(钩子)。
所以我必须让SendToMailTableAction 成为TableAction 类型。
我不能让函数组件成为函数以外的类型,那么什么是可接受的方法呢?
我可能会遗漏一些东西,因为我是 React 和 React 钩子的新手。
【问题讨论】:
-
从头开始很好。 React 范式严重倾向于组合而不是分层组件继承。请参阅reactjs.org/docs/… 除了一些空的承诺返回之外,您也没有任何状态或可见的副作用。转换为函数组件,然后在可行的情况下找到钩子的抽象。
标签: reactjs typescript react-functional-component