Reactjs 可重用的模态组件React-Typescript

Reactjs 可重用的模态组件React-Typescript,reactjs,typescript,bootstrap-4,bootstrap-modal,reactstrap,Reactjs,Typescript,Bootstrap 4,Bootstrap Modal,Reactstrap,我有一个组件,里面有一个按钮,就像这样- <Button variant="primary" disabled={checkAccepted} onClick={openModal}>Send</Button> const openModal = () => { return ( <Modal> <ModalBody>*Pass in swappable cont

我有一个组件,里面有一个按钮,就像这样-

<Button variant="primary" disabled={checkAccepted} onClick={openModal}>Send</Button>
const openModal = () => {

return (
            <Modal>
                <ModalBody>*Pass in swappable content here*</ModalBody>
            </Modal>
        )
}
发送
我想这个按钮,当它是活跃的,打开一个模式时,点击。我不知道如何做到这一点,一直在与道具乱搞,但似乎无法找出它。我还希望模态可以重用,以便任何内容都可以在模态体中传递。我正在考虑如何从OpenModel函数中打开模态? 我试着这样退了-

<Button variant="primary" disabled={checkAccepted} onClick={openModal}>Send</Button>
const openModal = () => {

return (
            <Modal>
                <ModalBody>*Pass in swappable content here*</ModalBody>
            </Modal>
        )
}
const openModal=()=>{
返回(
*在此处传入可交换内容*
)
}

但这似乎不起作用。我确信我遗漏了什么。

您应该将触发模态的函数作为道具传递给您的
组件。然后,在组件中,您希望添加onClick事件。不能将onClick事件设置为
。它会认为onClick是传递给
的一个道具。在
中,您可以将onClick事件设置为实际的
元素,并使用作为该事件的道具传入的函数

您可以使用状态来跟踪模式按钮的单击时间。您的函数可以如下所示:(我在这里使用基于类的组件,但是您可以对函数组件执行相同的操作)

然后,您可以设置模态组件

<Modal isShow={this.state.isModalButtonClicked} modalButton={this.buttonClickedHandler}>
   <div> ...set contents of modal</div>
</Modal>

<button onClick={this.buttonClickedHandler}>Show Modal</button>

…设置模式的内容
显示模态
因此,在模态组件中,可以有如下内容:

<React.Fragment>
    <Backdrop showModal={this.props.isShow} clicked={this.props.modalButton}/>
    {this.props.children}
</React.Fragment>

{this.props.children}

背景基本上是灰色背景。您还可以设置单击背景时要收听的onClick事件。

您应该将触发模态的函数作为道具传递给
组件。然后,在组件中,您希望添加onClick事件。不能将onClick事件设置为
。它会认为onClick是传递给
的一个道具。在
中,您可以将onClick事件设置为实际的
元素,并使用作为该事件的道具传入的函数

您可以使用状态来跟踪模式按钮的单击时间。您的函数可以如下所示:(我在这里使用基于类的组件,但是您可以对函数组件执行相同的操作)

然后,您可以设置模态组件

<Modal isShow={this.state.isModalButtonClicked} modalButton={this.buttonClickedHandler}>
   <div> ...set contents of modal</div>
</Modal>

<button onClick={this.buttonClickedHandler}>Show Modal</button>

…设置模式的内容
显示模态
因此,在模态组件中,可以有如下内容:

<React.Fragment>
    <Backdrop showModal={this.props.isShow} clicked={this.props.modalButton}/>
    {this.props.children}
</React.Fragment>

{this.props.children}

背景基本上是灰色背景。您还可以设置单击背景时要收听的onClick事件。

您不能从事件处理程序返回组件。react中处理事件的方法几乎总是改变触发重新渲染的应用程序的状态。在您的情况下,您需要跟踪模态的
open
状态

这可以通过受控方式(您自己跟踪打开状态并将其作为道具传递给
组件)或不受控制的方式(组件管理
打开状态本身)完成。第二种方法要求您提供一个元素(例如)来渲染作为触发器的
模态组件:

const MyModal = ({ children, trigger }) => {
  const [modal, setModal] = useState(false);
  const toggle = () => setModal(!modal);

  return (
    <div>
      {React.cloneElement(trigger, { onClick: toggle })}
      <Modal isOpen={modal} toggle={toggle}>
        <ModalBody>{children}</ModalBody>
      </Modal>
    </div>
  );
};
constmymodal=({children,trigger})=>{
const[modal,setModal]=useState(false);
const toggle=()=>setModal(!modal);
返回(
{React.cloneElement(触发器,{onClick:toggle}}
{儿童}
);
};
然后你可以这样使用它:

<MyModal trigger={<Button variant="primary">Send</Button>}>
    <p>This is the content.</p>
</MyModal>

这就是内容

或者,您可以以可控的方式实现它。这更灵活,因为它允许您在任何位置渲染触发元素:

const MyModal = ({ children, isOpen, toggle }) => (
  <div>
    <Modal isOpen={isOpen} toggle={toggle}>
      <ModalBody>{children}</ModalBody>
    </Modal>
  </div>
);
constmymodal=({children,isOpen,toggle})=>(
{儿童}
);
用法示例:

function App() {
  const [isOpen, setIsOpen] = useState(false);
  const toggle = () => setIsOpen(!isOpen);

  return (
    <div className="App">
      <Button variant="primary" onClick={toggle}>
        Send
      </Button>
      <MyModal isOpen={isOpen} toggle={toggle}>
        <p>This is the content.</p>
      </MyModal>
    </div>
  );
}
函数应用程序(){
常量[isOpen,setIsOpen]=useState(false);
常量切换=()=>setIsOpen(!isOpen);
返回(
发送
这就是内容

); }

无法从事件处理程序返回组件。react中处理事件的方法几乎总是改变触发重新渲染的应用程序的状态。在您的情况下,您需要跟踪模态的
open
状态

这可以通过受控方式(您自己跟踪打开状态并将其作为道具传递给
组件)或不受控制的方式(组件管理
打开状态本身)完成。第二种方法要求您提供一个元素(例如)来渲染作为触发器的
模态组件:

const MyModal = ({ children, trigger }) => {
  const [modal, setModal] = useState(false);
  const toggle = () => setModal(!modal);

  return (
    <div>
      {React.cloneElement(trigger, { onClick: toggle })}
      <Modal isOpen={modal} toggle={toggle}>
        <ModalBody>{children}</ModalBody>
      </Modal>
    </div>
  );
};
constmymodal=({children,trigger})=>{
const[modal,setModal]=useState(false);
const toggle=()=>setModal(!modal);
返回(
{React.cloneElement(触发器,{onClick:toggle}}
{儿童}
);
};
然后你可以这样使用它:

<MyModal trigger={<Button variant="primary">Send</Button>}>
    <p>This is the content.</p>
</MyModal>

这就是内容

或者,您可以以可控的方式实现它。这更灵活,因为它允许您在任何位置渲染触发元素:

const MyModal = ({ children, isOpen, toggle }) => (
  <div>
    <Modal isOpen={isOpen} toggle={toggle}>
      <ModalBody>{children}</ModalBody>
    </Modal>
  </div>
);
constmymodal=({children,isOpen,toggle})=>(
{儿童}
);
用法示例:

function App() {
  const [isOpen, setIsOpen] = useState(false);
  const toggle = () => setIsOpen(!isOpen);

  return (
    <div className="App">
      <Button variant="primary" onClick={toggle}>
        Send
      </Button>
      <MyModal isOpen={isOpen} toggle={toggle}>
        <p>This is the content.</p>
      </MyModal>
    </div>
  );
}
函数应用程序(){
常量[isOpen,setIsOpen]=useState(false);
常量切换=()=>setIsOpen(!isOpen);
返回(
发送
这就是内容

); }