【问题标题】:Convert React class components to function components将 React 类组件转换为函数组件
【发布时间】: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&lt;TableActions&gt;[](作为元素数组的抽象类)作为道具:

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


【解决方案1】:

希望这段代码有所帮助。

// TableAction.tsx
interface iTableAction {
  onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
  onMouseEnter?: (e: React.MouseEvent<HTMLButtonElement>) => void;
  onMouseLeave?: (e: React.MouseEvent<HTMLButtonElement>) => void;
  renderContent?: () => JSX.Element;
}

const TableAction = (props: ITableAction): React.ReactElement<ITableAction> => {
  onClick,
  onMouseEnter,
  onMouseLeave,
  renderContent,
}) => {
  return (
    <button onClick={onClick} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>
      {renderContent()}
    </button>
  );
};
// SendToMailTableAction.tsx
import { TableAction } from 'components';

...

const SendToMailTableAction = (props: ISendToMailTableActionProps): React.ReactElement<ITableAction> => {
  const onClick = (e: React.MouseEvent<HTMLButtonElement>) => {
    // Do something...
  };
  const onMouseEnter = (e: React.MouseEvent<HTMLButtonElement>) => {
    // Do something...
  };
  const onMouseLeave = (e: React.MouseEvent<HTMLButtonElement>) => {
    // Do something...
  };
  const renderContent = () => {
    return <div>{/* Render something... */}</div>;
  };

  return (
    <TableAction
      onClick={onClick}
      onMouseEnter={onMouseEnter}
      onMouseLeave={onMouseLeave}
      renderContent={renderContent}
    />
  );
};

【讨论】:

猜你喜欢
  • 2021-11-24
  • 2020-01-02
  • 2017-09-27
  • 2020-02-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多