【问题标题】:Modal element is not hiding [React & React - Bootstrap]模态元素没有隐藏 [React & React - Bootstrap]
【发布时间】:2019-05-16 20:30:45
【问题描述】:

我使用 React Bootstrap 创建了模态。尽管事实上,我正在使用 onHide 函数,但没有任何反应。这是我的模态:

        <React.Fragment>
            <Modal
                {...this.props}
                bsSize="large"
                aria-labelledby="contained-modal-title-lg"
                show={this.state.showModal}
                onHide={this.handleHide}
             >
            <Modal.Body>
               ...
            </Modal.Body>
            <Modal.Footer>
               <Button id = "closeModal" variant="danger" onClick= 
               {this.handleHide.bind(this)}>
                            Save and close
               </Button>
            </Modal.Footer>
            </Modal>
        </React.Fragment>

当点击某个元素时,我从其他组件传递“显示”。 onClick 该元素被指定为:“showModal: true”。然后我将 showModal 传递给根据所选选项呈现不同元素的其他组件:

{this.state.addingState && (
    <MyForm
        {...this.state.item}
        show={this.state.showModal}
        ...
    />
)}

最后在 MyForm 组件中,我有一个函数可以将 props 传递给具有模态的组件:

createModalComponent {
    ...
    let modalComponentProps= {
        ...
        show: this.props.show,
}

所以,这就是“表演”的方式。在我的带有模态组件的文件中,我有处理隐藏的功能:

handleHide() {
    this.setState({ showModal: false });
}

现在在这个组件中,showModal 的初始化状态如下:

constructor(props) {
    super(props);

    this.state = {
        showModal: this.props.show
    };

    this.handleHide = this.handleHide.bind(this);
}

我尝试了很多东西。其他状态变量,无需在状态中初始化 showModal 等等。单击按钮或超出模态框时,模态框仍然可见且不隐藏。我将非常感谢您的帮助和/或如何解决此问题的建议。

所以,showModal 的发展方式:父组件(this.state.addingState 发生的地方)-> MyForm 组件(让 modalComponentProps= { show: this.props.show, ... 发生的地方)-> 实际模态组件

Code on CodePen

【问题讨论】:

    标签: javascript html reactjs redux react-bootstrap


    【解决方案1】:

    shouldComponentUpdate方法

    shouldComponentUpdate(nextProps) {
        return !isEqual(this.props, nextProps);
    }
    

    您只检查道具,但您正在更改组件的状态。修复该方法或将其删除,它将起作用

    【讨论】:

    • 成功了!但现在我有其他问题 - 隐藏后无法回调模态
    • 模态行为之所以如此,是因为组件已安装,并且您正在构造函数中设置初始状态。然后根据其状态确定模态是否打开,这是一个问题。我准备了一个沙盒示例,说明如何解决 codesandbox.io/s/… 之类的问题
    【解决方案2】:

    您有两种可能性:您可以将方法添加到您的父级并像这样传递方法+显示的结果(使用相同名称的道具和方法进行最佳实践,这样您就不会混淆):

    父母

    <Modal
        {...this.props}
        bsSize="large"
        aria-labelledby="contained-modal-title-lg"
        show={this.state.showModal}
        handleHide={this.handleHide}
      >
    

    孩子

       <MyForm
            show={this.props.showModal}
            handleHide={this.props.handleHide}
        />
    

    要从父级使用模态,您可以在子级中这样调用它:this.props.handleHide(true)。

    或者您让子进程自己管理状态,因此您会将方法和状态放在子进程中,而不是父进程中(取决于架构)。

    不建议在子状态下添加道具。 此外,您可以使用 es6 函数来避免这样的绑定:

    handleHide = () => this.setState({ showModal: false });
    

    【讨论】:

    • 感谢您的回复!所以,如果我理解正确(根据第一个选项),我应该在父级中创建我的 handleHide 方法,其中还创建了 showModal? handleHide() { this.setState({ showModal: false }); } 然后将此方法作为道具传递,就像我对 showModal 所做的那样?之后,我可以通过 handleHide={this.handleHide} 在我的 Modal 组件和按钮 this.handleHide 中使用此方法(不绑定)?
    • 由于我目前的声誉,我无法对您的回复投赞成票,但我会记得稍后这样做;)
    • - 在 react 中始终使用 es6 函数,并且永远不要再使用绑定。 - 是的,将 handleHide() 方法添加到父级,然后当你传递它时,你的孩子可以像这样的道具访问:this.props.handleHide。 - 您可以选择我的答案作为我认为好的答案(无需投票),谢谢^^
    • 它不起作用或者我做错了什么:(在发生点击和 showModal: true 的组件中,我创建了这样的方法:handleHide = () => this.setState({ showModal: false } ); 然后我传递给下一个组件方法,如下所示:onHide={this.state.handleHide}。在该组件内部,我将方法传递给实际的模态组件,如下所示:letsurveyFormItem = { onHide: this.props.onHide }. 另外我在这里像这样初始化 prop: MyForm.propTypes { onHide: PropTypes.func } 和 MyForm.defaultProps { onHide: Function.prototype } .
    • 最后,在模态组件中 和按钮在这个模态中:
    猜你喜欢
    • 2016-05-08
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多