You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从兄弟组件调用prop函数仅触发一次问题排查

解决跨组件调用模态框仅能触发一次的问题

问题原因

当前代码中点击Two组件的「Open Modal」按钮仅能打开一次One组件的模态框,核心问题在于:

  • App组件的modal状态被设为true后,没有重置为false
  • One组件的useEffect仅在modal状态变化时触发,后续点击按钮时modal始终为true,无法触发useEffect更新open状态,导致模态框无法再次打开

解决方案

通过在One组件关闭模态框时,通知App组件重置modal状态,确保下次点击按钮时modal能从false变为true,触发useEffect更新open状态。

修改后的代码

  1. App组件:添加关闭模态框的回调函数并传递给One组件
function App() {
  let [modal, setModal] = useState(false)
  
  const handleModalClose = () => {
    setModal(false)
  }

  return (
    <div className="App">                      
      <div>
        <One modal={modal} onCloseModal={handleModalClose}/>
        <Two onModal={setModal}/>
      </div>
    </div>
  )
}
  1. One组件:在关闭模态框时调用回调函数重置App的modal状态
export function One({modal, onCloseModal}) {
  let [open, setOpen] = useState(false)
  
  useEffect(() => {
    setOpen(modal)
  }, [modal])

  const openModal = () => {
    setOpen(true)
  }
  
  const closeModal = () => {
    setOpen(false)
    onCloseModal() // 通知App重置modal状态
  }

  return (
  <> 
    <div>
      <button onClick={openModal}>Create</button>
      {open && <div>MODAL WINDOW<br /><br /><br /><span onClick={closeModal}>CLOSE</span></div>}
    </div>   
  </>
  )
}
  1. Two组件保持原代码不变即可

内容的提问来源于stack exchange,提问作者Sundar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:57:02