Модальный элемент не скрывается [React & React - Bootstrap]

Я создал модальное окно с помощью 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 у меня есть функция, которая передает реквизиты компоненту с модальным окном:

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

Итак, так происходит "шоу". В моем файле с модальным компонентом у меня есть функция для обработки hide:

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 (где let modalComponentProps = {show: this.props.show, ... происходит) -> фактический модальный компонент

Код на CodePen

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
3 685
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

у вас есть 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} и в кнопке this.handleHide (без привязки)?

adrian95999 16.12.2018 11:57

Я не могу проголосовать за ваш ответ из-за моей нынешней репутации, но я не забуду сделать это позже;)

adrian95999 16.12.2018 12:03

- Всегда используйте функции es6 в реакции и никогда больше не используйте привязку. - Да, добавьте метод handleHide () к родительскому объекту, тогда, когда вы его передадите, ваш ребенок сможет получить доступ в виде таких свойств, как this.props.handleHide. - Вы можете выбрать мой ответ как хороший, я думаю (не нужно голосовать), спасибо ^^

Niels Dominguez 16.12.2018 19:10

Это не сработало, или я сделал что-то не так :( В компоненте, в котором происходит щелчок и showModal: true, я создал такой метод: handleHide = () => this.setState ({showModal: false}); Затем я перехожу к следующий метод компонента вроде этого: onHide = {this.state.handleHide}. Внутри этого компонента я передаю метод фактическому модальному компоненту следующим образом: let SurveyFormItem = {onHide: this.props.onHide}. Также я инициализирую prop вот так: MyForm.propTypes {onHide: PropTypes.func} и MyForm.defaultProps {onHide: Function.prototype}.

adrian95999 16.12.2018 20:17

Наконец, в модальном компоненте <Modal {... this.props} ... show = {this.state.showModal} onHide = {this.props.onHide}> и кнопка в этом модальном окне: <Button id = "closeModal" Вариант = "опасность" onClick = {this.props.onHide}> Сохранить и выйти </Button>

adrian95999 16.12.2018 20:18

измените это: onHide = {this.state.handleHide} на это: onHide = {this.handleHide} Это компонент? : let SurveyFormItem = {onHide: this.props.onHide} Обычно нам не нужно добавлять defaultProps, вы можете удалить defaultProps и PropTypes (лично я не думаю, что это очень полезно)

Niels Dominguez 16.12.2018 20:36

Я изменил его, но по-прежнему ничего :( Кроме того, я заметил ошибку в консоли: «React не распознает опору showModal в элементе DOM.» Такая же ошибка появляется в свойстве bsSize в модальном режиме. Да, это мой компонент, который передает реквизиты в разные формы - в моем случае я пишу о случае с модальным компонентом, который содержит форму. Я написал для него другое имя в комментарии, извините. Я не могу его сейчас изменить, поэтому modalComponentProps === SurveyFormItem

adrian95999 16.12.2018 22:02
Ответ принят как подходящий

Посмотрите метод shouldComponentUpdate

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

Вы проверяете только свойства, но меняете состояние компонента. Исправьте метод или удалите его, и он будет работать

Это сработало! Но теперь у меня другая проблема - я не могу перезвонить в модальном режиме после того, как скрыл его.

adrian95999 21.12.2018 09:56

Причина, по которой модальное окно ведет себя так, заключается в том, что компонент установлен, и вы устанавливаете начальное состояние в конструкторе из реквизита. Затем вы определяете, открыто модальное окно или нет, в зависимости от его состояния, и вот в чем проблема. Я подготовил песочницу с примером того, как можно решить что-то подобное codeandbox.io/s/…

Mateusz Krzyżanowski 21.12.2018 19:54

Другие вопросы по теме