无法打开/关闭带有父类组件和子功能组件的模态

Posted

技术标签:

【中文标题】无法打开/关闭带有父类组件和子功能组件的模态【英文标题】:Unable to open/close modal with parent class component and child functional component 【发布时间】:2022-01-12 04:37:31 【问题描述】:

我有一个父组件,我正在努力正确打开/关闭子组件(模态)。下面的两个代码框是我的组件的简化示例。

编辑:这是一个带有以下代码的代码沙箱——没有实际的模式,但是我已经记录了我认为会对这个问题产生影响的所有有状态值,你可以看到它们是如何产生的改变/不要像我希望的那样改变。

Code Sandbox

当父组件打开时,我可以点击MenuItem,我可以看到状态变化,但是模态不会打开,除非我暂时关闭父组件并重新打开它(然后父组件在模态打开的情况下打开已经) 当模式打开时,我尝试通过单击关闭按钮来关闭(该按钮在 onClick 方法内部具有来自父级的状态更改功能。this.state.showModal 保持为真,不会更改为假。 如果我将 closeModal 状态值添加到子组件并在关闭按钮 onClick 期间更改它,this.state.showModal 仍然保持 true。

感谢任何伸出援手的人,如果您有任何澄清问题,请随时提出!

class Parent extends Component 
    
    constructor(props) 
      super(props);
      this.showModal = this.showModal.bind(this);
      this.closeModal = this.closeModal.bind(this)
      this.state = 
        showModal: false
      ;
    this.showModal = this.showModal.bind(this)
    this.closeModal = this.closeModal.bind(this)
    
    showModal() 
      this.setState( showModal: true );
    
    closeModal() 
      this.setState( showModal: false );
    
    render()  
      return (
      <MenuItem onClick=this.showModal>
      <ChildComponent
       prop1=prop1
       isOpen=this.state.showModal
       closeModal=this.closeModal
       />
       </MenuItem>
)
const ChildComponent = (
  prop1,
  isOpen,
  closeModal
  ) => 
  
  const [modalOpen, setModalOpen] = useState(isOpen)


  useEffect(() => 
    setModalOpen(isOpen)
  ,[isOpen])
  
  console.log('isopen on child', isOpen)
  console.log('modalOpen', modalOpen)
  return (
  <div>
   modalOpen && (
  <button
  onClick=() => 
    setModalOpen(false)
    closeModal()
  
  >
    'click to close modal'
    </button>
   )
   </div>
)

)

【问题讨论】:

您是否介意制作一个可以显示完整代码的沙盒。如果您愿意,可以使用 codesandbox.io 。这将更容易理解究竟是什么问题。 @decpk 我已将代码附加到代码盒中,并让控制台记录了每个文件上的值——您将能够看到状态发生变化的位置,并且不会以我想要的方式发生变化他们到codesandbox.io/s/beautiful-moon-nem8m?file=/src/… @PatrickAllen 请重新检查附加的链接。我在里面看不到你的代码,只有几个空文件! @MathewsSunny 再次检查链接——我没有意识到我必须事先保存文件,但我现在已经保存了!在深入解决问题后,我的 handleClose 函数似乎没有更新父组件状态。 【参考方案1】:

我发现了我的问题!

在我的父组件中,设置模式打开的 onClick 处理程序包装了我的子组件。我需要像这样删除它并有条件地单独渲染它:

<div>
        <div onClick=this.showModal>"Click here to open modal"</div>
        this.state.showModal && (
          <ChildComponent
            prop1=prop1
            isOpen=this.state.showModal
            closeModal=this.closeModal
          />
        )
      </div>

【讨论】:

以上是关于无法打开/关闭带有父类组件和子功能组件的模态的主要内容,如果未能解决你的问题,请参考以下文章

我的提交和编辑表单的 React 模态组件不会关闭?

为啥我不能将用于关闭模态组件的“a”元素居中?

如何在响应时关闭渲染组件的按钮?

由不同组件打开的 React Native 关闭 Modal

Vue.js 模态窗口在从另一个组件单击时未打开

win7 telnet无法开启。