React / Next. js Закрыть один модальный и открыть другой одновременно - PullRequest
0 голосов
/ 06 февраля 2020

Я создаю серверный веб-сайт, используя Node.js, Express. js, MySQL и Next. js (фреймворк для React). По сути, это игра «Опасность».

В настоящее время я запрашиваю базу данных и извлекаю все вопросы. Затем я составил таблицу с суммами в $, и можно щелкнуть каждую ячейку в таблице, чтобы раскрыть вопрос. Когда вы нажимаете на ячейку / вопрос в таблице, открывается модальное окно. Он говорит вопрос, а затем под ним есть место для ответа и кнопка отправки.

Сейчас я хочу сделать следующее: когда я нажимаю кнопку «Отправить», текущий модал с вопросом должен исчезнуть, а затем новый модал с «обратной связью», в основном говорящий «правильно» с галочкой или неправильно с символом топора, должен всплывающее окно.

Но я не уверен, как сделать вышеупомянутое или даже если это хороший способ go об этом. Я очень новичок в этом, поэтому, пожалуйста, помогите мне.

Вот что у меня есть до сих пор. Прямо сейчас, когда я запускаю этот код, когда я нажимаю кнопку отправки, модальный вопрос исчезает, но модал обратной связи не появляется.

Модальный вопрос:

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;

1 Ответ

0 голосов
/ 06 февраля 2020

Вы можете работать со вторым модалом так же, как и с первым:

  1. Добавить ключ в состояние SampleQ и отслеживать с ним видимость второго мода.
  2. Передайте обработчик, изменяющий эту видимость с true на UserAnswer, и вызывайте его при щелчке на кнопку отправки.

Не следует открывать модальное "в" другом модале, подобном этому: {modalOpen ? <Feedback showModal={this._openModal.bind(this)} closeModal={this._closeModal.bind(this)} /> : ''}. SampleQ должен хранить в своем состоянии видимость обоих модалов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...