react怎样手写动态弹窗

不得不说antd里面的Modal已经很好用,符合大部分场景的需求了。但是如果你需要自己手写一个Modal,你会怎么写呢?

当然是照着Modal抄,然后加上自己需要的功能咯!我们打开控制台,会发现Modal弹出以后,body会增加一个div子元素。

好了我们怎么凭空给body增加子元素呢?
首先创建一个div element,然后append到body里面,copy下面两句话在控制台执行会发现body就增加了一个空的div元素啦。

const divEl = document.createElement('div');

document.body.appendChild(divEl);

然后我们需要往这个div里面填充内容对不对,怎么填充呢?哈哈,利用jsx和reactDom的render功能

ReactDOM.render(<div>aaaaaa</div>, divEl);

这个<div>aaaaaa</div>是一个简单的jsx对象示例。当然如果你执行这个的话,只是把这个放在了文档的最下面,还不是弹框啊。弹框的内容和样式要放在这个jsx里面。

copy一个别人的弹框样式

const ROOT = styled.div`
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 100;
  .bgc {
    position: fixed;
    z-index: 110;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.2);
  }
  .titles {
    background-color: #fff;
    font-size: 12px;
    position: fixed;
    z-index: 120;
    width: 240px;
    height: 120px;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    color: black;
  }
  .titles > p {
    margin: 20px 15px;
  }
  .titles > div {
    background-color: rgb(76, 116, 242);
    color: #fff;
    width: 80px;
    height: 30px;
    text-align: center;
    line-height: 30px;
    margin: 0 auto;
    border-radius: 4px;
    cursor: pointer;
  }
`;

<ROOT className="bgcBox">
      <div className="bgc"></div>
      <div className="titles">
        <p>继续!</p>
        <div>我知道了</div>
      </div>
    </ROOT>

属性visible应用做成state,这样可以动态控制这个弹框的可见性。还有点击ok的操作等等,啊,要抄袭别的人也是件很困难的事情啊,先写到这儿吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个React全局命令式弹窗组件示例。这个组件可以在应用程序的任何地方动态地创建和销毁弹窗。 首先,您需要安装React Modal组件库。可以通过以下命令进行安装: ``` npm install react-modal ``` 接下来,您可以创建一个全局弹窗组件并在其中封装React Modal。在组件中,您需要定义一个状态来控制Modal的显示和隐藏。这个状态可以使用useState钩子来实现。此外,为了使组件成为全局组件,您需要将其渲染到应用程序的根元素中。 ``` import React, { useState } from "react"; import ReactDOM from "react-dom"; import Modal from "react-modal"; function GlobalModal() { const [isOpen, setIsOpen] = useState(false); const [content, setContent] = useState(""); const handleOpenModal = (message) => { setIsOpen(true); setContent(message); }; const handleCloseModal = () => { setIsOpen(false); setContent(""); }; return ( <Modal isOpen={isOpen} onRequestClose={handleCloseModal}> <h2>全局弹窗</h2> <p>{content}</p> <button onClick={handleCloseModal}>关闭弹窗</button> </Modal> ); } function createGlobalModal() { const container = document.createElement("div"); document.body.appendChild(container); ReactDOM.render(<GlobalModal />, container); return { open: (message) => { ReactDOM.render(<GlobalModal />, container); ReactDOM.render( <GlobalModal open message={message} />, container.firstChild ); }, close: () => { ReactDOM.unmountComponentAtNode(container); container.remove(); }, }; } export default createGlobalModal; ``` 在上面的示例中,我们定义了一个名为GlobalModal的全局弹窗组件,它使用React Modal进行封装。我们使用useState钩子定义了一个名为isOpen的状态,它用于控制Modal的显示和隐藏,并使用useState钩子定义了一个名为content的状态,它用于在弹窗中显示文本内容。handleOpenModal和handleCloseModal函数分别用于打开和关闭全局弹窗,并设置content状态的值。我们在Modal组件中传递了两个props:isOpen和onRequestClose。isOpen用于控制Modal的显示和隐藏,onRequestClose用于在用户点击Modal外部时关闭Modal。 我们还定义了一个名为createGlobalModal的函数,用于创建全局弹窗。这个函数会在应用程序的根元素中创建一个新的div元素,并将GlobalModal组件渲染到这个元素中。该函数返回一个对象,该对象包含两个方法:open和close。open方法用于打开全局弹窗,并将指定的文本内容显示在弹窗中。close方法用于关闭全局弹窗。 要使用此全局命令式弹窗组件,您可以在需要显示弹窗的任何地方调用createGlobalModal函数,并使用open方法指定要在弹窗中显示的文本内容。例如: ``` import React from "react"; import createGlobalModal from "./createGlobalModal"; function App() { const handleClick = () => { const globalModal = createGlobalModal(); globalModal.open("这是一个全局弹窗"); }; return ( <div> <button onClick={handleClick}>打开全局弹窗</button> </div> ); } export default App; ``` 在上面的示例中,我们在App组件中创建了一个按钮,并将handleClick函数绑定到其onClick事件上。handleClick函数调用了createGlobalModal函数,并使用open方法指定了要在弹窗中显示的文本内容。当用户单击按钮时,全局弹窗将被打开,并显示指定的文本内容。 请注意,全局命令式弹窗组件虽然很方便,但并不是React应用程序的首选方法。在大多数情况下,您应该使用声明式组件来管理应用程序的状态和UI。但是,在某些情况下,全局命令式弹窗组件可能是有用的,例如在需要动态显示通知或警告的应用程序中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值