开发者问题收集

如何从 React 中的另一个组件打开 Modal

2020-08-09
5245

我在组件 A 中有一个 Modal,我想通过单击组件 B 中的按钮来显示该 Modal。

我使用了 ref 关键字,但它不适用于此控制台错误

“TypeError:无法解构“object null”的属性“toggleModal”,因为它为 null。”

A.js:

export class LoginForm extends Component{
constructor(props){
    super(props);
    this.state ={
        isModalOpen: false
    }
    this.toggleModal = this.toggleModal.bind(this);
};

toggleModal(){
    this.setState({
    isModalOpen: !this.state.isModalOpen
    })
};

render(){
    return(
        <Modal isOpen={this.state.isModalOpen} toggle={this.toggleModal}>
            <ModalHeader toggle={this.toggleModal}>Login</ModalHeader>

            <ModalBody>
                ...
            </ModalBody>
        </Modal>
    )
}

B.js:

import { LoginForm } from './FormsComponent';

        class Header extends Component{
        constructor(props){
        super(props);
        };
    
      loginModalRef = ({toggleModal}) =>{
        this.showModal = toggleModal;
      };
      onLoginClick = () =>{
        this.showModal();
      }
      render(){
        return(
              <Nav className="ml-auto" navbar onClick={this.onLoginClick}>
                  <NavItem>
                     <Button outline color="primary">
                        <span className="fa fa-sign-in fa-lg"> Login</span>
                     </Button>
                  </NavItem>
               </Nav>
    
             <LoginForm ref={this.loginModalRef} />
    
        )}}

更新问题: 这种方式对我来说非常有效,我发现错误消息是由于我的代码中的另一个问题造成的。所以,如果你想做同样的事情,你可以把这个作为解决方案。

3个回答

使用状态管理是一种很好的做法,否则 refs 可以帮助您实现这一点,您可以通过组件 B 访问组件 A 函数。

Amit Shakya
2020-08-09

您可以将状态“向上”移动到包含 LoginForm 和 Header 的父组件。并将回调和状态传递给两个组件

    class Parent {
    state = { modalOpen: false }
    openModal = ()=> setState({modalOpen: true})
render(){
return <div>
    <Header onClick={openModal} />
    <LoginForm modalOpen={modalOpen} />
</div>
}
}
nachmo
2020-08-09

为了处理来自子级的模态状态,我使用了这个解决方案 https://stackoverflow.com/a/71464748/1770571 并且它对我来说正常工作

Salma Gomaa
2022-03-14