【问题标题】:React/Next.js Close one modal and open another at the same timeReact/Next.js 关闭一个模态并同时打开另一个
【发布时间】:2020-02-10 03:25:27
【问题描述】:

我正在使用 Node.js、Express.js、MySQL 和 Next.js(React 框架)构建一个服务器渲染网站。这个概念基本上是一个危险游戏。

目前我所拥有的是从数据库中查询并提取所有问题。然后我用 $amounts 制作了一个表格,可以单击表格中的每个单元格来显示问题。当您单击表格中的单元格/问题时,会打开一个模式。它说出问题,然后在它下方有一个回答空间和一个提交按钮。

现在我想要做的是,当我点击提交按钮时,带有问题的当前模态应该消失,然后一个新的以“反馈”为特色的模式,基本上用复选标记表示正确或用 x 符号表示不正确应该弹出。

但我不确定如何执行上述操作,或者即使这是解决此问题的好方法。我对此很陌生,所以请帮帮我。

这是我目前所拥有的。现在当我运行这段代码时,当我点击提交时,问题模式消失了,但没有弹出反馈模式。

问题模式:

import React, { Component } from 'react';

import Modal from "react-bootstrap/Modal";
import Button from "react-bootstrap/Button";
import UserInput from './userInput.js';
import Feedback from "./feedback/feedback";

class SampleQ extends Component {
    static getInitialProps({query: {amount, question, answer}}) {
        return {specAmt: amount, specQ: question, specA: answer}
    }

    constructor(props) {
        super(props);

        this.state = {
            showQuestion: false, // tracks visibility of first modal (the question modal in this component)
            showFeedback: false // tracks visibility of second modal (the feedback modal in other component)
        };

        this.handleShow = () => {
            this.setState({ showQuestion: true });
        };

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

        this.submitForm = () => {
            this.setState({
                showQuestion: false, // close question modal
                showFeedback: true, // should open Feedback modal
            });
        };

        this.closeFeedback = () => {
            this.setState( { showFeedback: false }); // close Feedback modal
        }
    }

    render() {
        return (
            <>
                <Button variant="outline-danger" size = "lg" onClick={this.handleShow}>
                    $ {this.props.amount}00
                </Button>

                <Modal
                    show={this.state.showQuestion}
                    onHide={this.handleHide}
                    dialogClassName="modal-90w"
                    aria-labelledby="example-custom-modal-styling-title"
                >
                    <Modal.Header closeButton>
                        <Modal.Title id="example-custom-modal-styling-title">
                            Question
                        </Modal.Title>
                    </Modal.Header>
                    <Modal.Body>
                        <p>
                            {this.props.question}
                        </p>
                        <div>
                            <UserInput
                                answer={this.props.specA}
                                handleClick={this.submitForm}
                            />
                            <Feedback
                                showModal={this.state.showFeedback}
                                onSubmit={this.closeFeedback}
                            />
                        </div>
                    </Modal.Body>
                </Modal>
            </>
        );
    }
}

export default SampleQ;

问题模式的表格:

import React, { Component } from "react";

import Form from "react-bootstrap/Form";
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
import Button from "react-bootstrap/Button";

class UserInput extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <Form onSubmit={this.props.handleClick}>
                <Form.Group as={Row} controlId="formAnswer">
                    <Form.Label column sm={2}>
                        Answer
                    </Form.Label>
                    <Col sm={10}>
                        <Form.Control type="text" placeholder="Enter Here"/>
                    </Col>
                </Form.Group>
                <div>
                    <Button
                        variant="primary"
                        onClick={this.props.handleClick}
                    >Submit</Button>
                </div>
            </Form>
        );
    }
}

export default UserInput;

反馈模式:

import React, { Component } from 'react';
import styles from "../../scss/modalStyle.scss";
import Modal from "react-bootstrap/Modal";
import { AiFillCheckCircle } from 'react-icons/ai';
import { IconContext } from "react-icons";
import Button from "react-bootstrap/Button";

class Feedback extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <Modal
                show={this.props.showModal}
                onHide={this.props.onSubmit}
                className="Feedback"
            >
            <Modal.Dialog style={[styles.modalDialog, styles.modalConfirm]}>
                <Modal.Body style={styles.modalContent}>
                    <Modal.Body style={styles.modalHeader}>
                        <Modal.Body style={styles.iconBox}>
                            <IconContext.Provider value={{ size: "70px", className: "global-class-name" }}>
                                <div>
                                    <AiFillCheckCircle />
                                </div>
                            </IconContext.Provider>
                        </Modal.Body>
                        <h4 className='mx-auto'>Congratulations!</h4>
                    </Modal.Body>
                    <Modal.Body style={styles.modalBody}>
                        <p className="text-center">That was the correct answer.</p>
                    </Modal.Body>
                    <Modal.Body style={styles.modalFooter}>
                        <Button
                            className="btn btn-success btn-block"
                            data-dismiss="modal"
                            onClick={this.props.onSubmit}
                        >
                            OK
                        </Button>
                    </Modal.Body>
                </Modal.Body>
            </Modal.Dialog>
            </Modal>
        );
    }
}

export default Feedback;

【问题讨论】:

    标签: javascript reactjs modal-dialog components next.js


    【解决方案1】:

    您可以像处理第一个模态一样处理第二个模态:

    1. SampleQ 状态添加一个键并使用它跟踪第二个模态的可见性。
    2. 传递一个处理程序,将可见性从true 更改为UserAnswer,并在提交点击时调用它。

    您不应该像这样“在”另一个模态中打开模态:{modalOpen ? &lt;Feedback showModal={this._openModal.bind(this)} closeModal={this._closeModal.bind(this)} /&gt; : ''}。 SampleQ 应该在其状态中存储两个模态的可见性。

    【讨论】:

    • 所以在 SampleQ 中我添加了一个名为 showFeedback 的键,用于跟踪第二个模态的可见性。我创建了一个名为 this.submitForm 的处理程序,它将 showFeedback 的状态设置为 true 并将 showQuestion 的状态设置为 false。所以这应该打开第二个模态并关闭第一个模态。我将 this.submitForm 作为道具传递给 UserAnswer 并将其命名为 handleClick。在 UserAnswer 的 Form 标记中,我添加了 onSubmit={this.props.handleClick} 并在具有提交按钮的 Button 标记中添加了 onClick={this.props.handleClick}。现在我只是对在哪里渲染反馈组件以及如何渲染感到困惑?
    • 在这种情况下,您应该在 SampleQ 组件中将反馈模式放在 UserAnswer 旁边。他们应该是兄弟姐妹。
    • 我已经更新了原始帖子以反映我现在拥有的代码。我相信我做了你所要求的一切,但由于某种原因,现在当我点击问题模式上的提交按钮时,它只是随机清除除导航栏以外的整个页面(基本上删除了整个表格)
    • 您将Feedback 作为Modal.Body 组件的子组件。我建议您将其作为问题模式的兄弟。将Feedback 组件放在SampleQ 组件下面&lt;/Modal&gt;
    • 你能看看我发的这个新的stackoverflow帖子吗? stackoverflow.com/questions/60141594/…。我将反馈组件放在 Modal 下方,但它仍然无法正常工作。我现在确定这是因为我的配置或安装,因为这个沙箱有我的代码工作:codesandbox.io/s/stackoverflow-answer-60141594-l4lrm。这是我在 github.com/ruthvikkonda/Jeopardy/tree/debug 上的所有代码。我猜这与我的配置有关,但我不知道是什么
    猜你喜欢
    • 2013-10-12
    • 2014-10-08
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多