使用 refs 调用组件

话不多说,先上代码

Class

type ModalStates = {
  visible: boolean;
};

class MyClassModal extends React.Component<any, ModalStates> {
  constructor(props: any) {
    super(props);
    this.state = {
      visible: false,
    };

    this.openModal = this.openModal.bind(this);
    this.closeModal = this.closeModal.bind(this);
  }

  openModal() {
    this.setState({ visible: true });
  }

  closeModal() {
    this.setState({ visible: false });
  }

  render() {
    const { visible } = this.state;

    return (
      <>
        <Modal
          title="My Class Modal"
          visible={visible}
          onOk={this.closeModal}
          onCancel={this.closeModal}
        >
          <p>Class Component</p>
        </Modal>
      </>
    );
  }
}

class MyClassApp extends React.Component<any, any> {
  modal: RefObject<MyClassModal>;

  constructor(props: any) {
    super(props);

    this.modal = React.createRef<MyClassModal>();
    this.openModal = this.openModal.bind(this);
  }

  openModal() {
    this.modal.current?.openModal();
    console.log(this.modal);
  }

  render() {
    return (
      <div>
        <Button type="primary" onClick={this.openModal}>
          Open Class Modal
        </Button>
        <MyClassModal ref={this.modal} />
      </div>
    );
  }
}

Function

const MyFunctionModal = React.forwardRef<MyFunctionModalRefs, any>((props, ref) => {
  const [visible, setVisible] = useState(false);

  useImperativeHandle(ref, () => ({ openModal }));

  const openModal = () => {
    setVisible(true);
  };

  const closeModal = () => {
    setVisible(false);
  };

  return (
    <>
      <Modal title="My Function Modal" visible={visible} onOk={closeModal} onCancel={closeModal}>
        <p>Function Component</p>
      </Modal>
    </>
  );
});

const MyFunctioncApp: React.FC = () => {
  const ref = createRef<MyFunctionModalRefs>();

  const openModal = () => {
    console.log(ref);
    ref.current?.openModal();
  };

  return (
    <div>
      <Button type="primary" onClick={openModal}>
        Open Function Modal
      </Button>
      <MyFunctionModal ref={ref} />
    </div>
  );
};