React:从 React Modal 组件触发一个函数

React: Trigger a function from React Modal component

更新:代码沙箱 link - https://codesandbox.io/s/goofy-dubinsky-4ui5v?file=/src/SearchRow.js

有一个用例,我们有一个搜索结果 table 并且有些行有一个按钮,可以出于业务目的审核该行数据。现在,当用户单击该按钮时,我们需要提示用户进行确认,但我们仍然不知道如何触发它。

TODO 部分要做什么 (SearchRow.js)?

这里是主要内容SearchResultsPage.js

return (
  {results.map((searchRow) => {
    <SearchRow content={searchRow.content} showSaveButton={searchRow.content.id === 10} />
  });
);

SearchRow.js

function SearchRow({content, showSaveButton}) {
  const getConfirmation = (event) => {
     // TODO: Call Modal.js, if user presses yes then call the saveProductData function, otherwise return
  }

  const saveProductData = async () => {
    await axios.post("url", content);
  }

  <div>
    <p>{content.title}</p>
    {showSaveButton && 
      <Button variant="primary" onClick={(e) => getConfirmation(e)} />
    }
  </div>
}

终于Modal.js

function Modal({
  heading,
  message,
  buttonSuccess = "Yes",    
  buttonFailure = "No",
  showModal = false,
}) {
  const [show, setShow] = useState(showModal);

  return (
    <BootstrapModal show={show} onHide={setShow(false)}>
      <BootstrapModal.Header closeButton>
        <BootstrapModal.Title>{heading}</BootstrapModal.Title>
      </BootstrapModal.Header>
      <BootstrapModal.Body>{message}</BootstrapModal.Body>
        <BootstrapModal.Footer>
          <Button variant="secondary" onClick={setShow(false)}>
            {buttonSuccess}
          </Button>
          <Button variant="primary" onClick={setShow(false)}>
            {buttonFailure}
          </Button>
       </BootstrapModal.Footer>
    </BootstrapModal>
  );
}

有人可以帮助解决如何实现这个问题,或者是否有任何其他更好的方法或任何建议?

提前致谢:)

我的 ConfirmationModal 包装了我的 Modal,并允许我传入一个 onConfirm 方法,然后当有人单击成功按钮时我可以调用该方法。然后我也从我的包装器控制我的 Modal 'show'。

据我所知,您只想在单击按钮后呈现模式,虽然这对于非 React 环境来说很自然,但在 React 中它以不同的方式工作。在最简单的解决方案中,Modal 应该始终呈现,当用户单击按钮时,您将模式打开 属性 更改为 true

因此,您可以将显示和隐藏模态的逻辑从 Modal.js 移动到 SearchRow.js,然后当用户单击 showSaveButton 按钮时,您可以将 showModal 设置为 true,并在 return 方法中检查该变量是否为真,如果是,则显示模态,否则 return null。 其次,您将两个函数作为 props 传递: 如果按下模态上的“YES”按钮,将执行第一个,如果按下“NO”按钮,将执行第二个。

这是您修改后的代码:

SearchRow.js

function SearchRow({content, showSaveButton}) {

  const [showModal,setShowModal] = useState(false);
  
  const displayConfimationModal = (event) => {
     setShowModal(true);
  }
  
  const handleConfirmation = (event) => {
    console.log("confirmed");
    await saveProductData();
    setShowModal(false);
  }
  
  const handleDecline = (event) =>{
    console.log("declined");
    setShowModal(false);
  }

  const saveProductData = async () => {
    await axios.post("url", content);
  }
  
return (
  <div>
    <p>{content.title}</p>
    {showSaveButton && 
      <Button variant="primary" onClick={(e) => displayConfimationModal(e)} />
    }
     {showModal ? ( < Modal onConfirm = {handleConfirmation}  onDecline={handleDecline}/>) : null}
  </div>);
}

Modal.js

function Modal({
  heading="Default heading",
  message="Default message",
  onConfirm,
  onDecline,
  buttonSuccess = "Yes",    
  buttonFailure = "No",
}) {
  

  return (
    <BootstrapModal>
      <BootstrapModal.Header closeButton>
        <BootstrapModal.Title>{heading}</BootstrapModal.Title>
      </BootstrapModal.Header>
      <BootstrapModal.Body>{message}</BootstrapModal.Body>
        <BootstrapModal.Footer>
          <Button variant="secondary" onClick={onConfirm}>
            {buttonSuccess}
          </Button>
          <Button variant="primary" onClick={onDecline}>
            {buttonFailure}
          </Button>
       </BootstrapModal.Footer>
    </BootstrapModal>
  );
}

export default Modal;