React中几种编写弹窗的方式

文章介绍了两种在React中处理按钮和弹窗的方法,一是将按钮和弹窗封装成一个组件,提高代码复用和维护性;二是利用NiceModal库,简化弹窗的创建,提供更简洁的API。通过这种方式,可以更好地管理项目中的Modal组件,增强代码的可维护性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方式一:按钮与弹窗封装成一个组件

将按钮和弹窗封装成一个组件,可以大大提高 React 代码的可重用性、可维护性和可扩展性。以下是示例代码:

import React, { useState } from "react";
import { Button, Modal } from "antd";

const MixWay = (props) => {
  const [visiable, setVisiable] = useState(false);

  const onOk = () => {
    console.log("编写自己的onOk逻辑");
    closeModal();
  };

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

  return (
    <>
      <Button onClick={() => setVisiable(true)}>按钮+弹窗</Button>
      <Modal
        title="按钮+弹窗"
        open={visiable}
        onOk={onOk}
        onCancel={closeModal}
        afterClose={closeModal}
      >
        <p>弹窗内容</p>
      </Modal>
    </>
  );
};

export default MixWay;

封装成一个组件后,我们可以轻松地复用该组件并根据需要进行扩展。

实际例子

比如下面两个回放按钮

9c1a6516ba43cee4d7893cdd1799448e.png

按钮
  • 单批次回放

35d5e48365314b7d910502725e78f9f7.png

单批次回放
  • 单接口批量回放

8465cf358b001be761f54ab6936fdc32.png

单接口批量回放

两者弹窗内容基本一致,只是单接口批量回放需要指定接口,单批回放不需要指定接口

所以将它封装成一个组件

方式二:函数式弹出弹窗

https://juejin.cn/post/7130623457993162759

https://opensource.ebay.com/nice-modal-react/#real

使用https://github.com/ebay/nice-modal-react,它帮助我们快速创建弹框,写起来更加简洁

MyModal弹窗

import React from "react";
import NiceModal, { useModal } from "@ebay/nice-modal-react";
import { Modal } from "antd";

const MyModal = NiceModal.create((props) => {
  const { name } = props;
  const modal = useModal();

  const onOk = () => {
    console.log("编写自己的onOk逻辑");
    modal.hide();
  };

  return (
    <Modal
      title="Hello Antd"
      open={modal.visible}
      onOk={onOk}
      onCancel={modal.hide}
      afterClose={modal.remove}
    >
      Greetings: {name}!
    </Modal>
  );
});

MyModal.propTypes = {};

export default MyModal;

AntdSample使用

import React from "react";
import { Button } from "antd";
import NiceModal from "@ebay/nice-modal-react";
import MyModal from "./MyModal";

const AntdSample = () => {
  return (
    <>
      <Button onClick={() => NiceModal.show(MyModal, { name: "Nate" })}>
        Show Modal
      </Button>
    </>
  );
};

export default AntdSample;

index.js

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import NiceModal from "@ebay/nice-modal-react";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <NiceModal.Provider>
      <App />
    </NiceModal.Provider>
  </React.StrictMode>
);

这段代码使用了 NiceModaluseModal,这是 eBay 开发的一个 React 组件库,能够帮助我们快速创建模态框(Modal)。使用它有以下好处:

  1. 代码简洁:NiceModal 将 Modal 的显示逻辑和 UI 逻辑封装好,我们只需要编写自己的逻辑即可。在这段代码中,我们只需要编写 MyModal 组件的内容,而不用关心 Modal 的显示和关闭逻辑。

  2. 可维护性高:使用 NiceModal,我们可以将重复的 Modal 逻辑封装成一个组件,便于统一管理和维护。下次再有类似的 Modal 需求时,我们只需要拿出这个组件进行改造即可。

  3. 可扩展性好:NiceModal 提供了一些钩子函数(例如 useModal)和配置项,可以方便地扩展自己的 Modal 组件。例如,在 MyModal 组件中使用了 useModal 钩子函数获取 modal 对象,然后就可以调用它提供的一些方法(例如 hide())来控制 Modal 的显示和关闭。

小结

以上两种编写弹窗的方式,方式二使用 nice-modal-react 更加简洁,不需要手动编写显示关闭逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值