Как закрыть при нажатии кнопки визуализированного компонента в реакции?

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

import React, { Component } from 'react';
  import AddModal from './addmodal';

  class Page extends Component {
    constructor(){
      super();
      this.state = { isModalOpen: false };
    }
    ...//skip
    handleAdd= () =>{
      this.setState({ isModalOpen: true });
    }
    render(){
      return (
        <div>
          <button onClick = {this.handleAdd} > Add </button>
          <AddModal isOpen = {this.state.isModalOpen} />
        </div>
        )
    }
  }


  import React, { Component } from 'react';

  class AddModal extends Component {
    // ... skip

  handleClose = () => {
    this.setState({ open: false });
  };

    render(){
      return(
        <modal inOpen = {this.props.isOpen} >
        <Button onClick = {this.handleClose}>
          Okay
        </Button>
          ...//skip
        </modal>
      )
    }
  }

  export default AddModal;

Не могли бы вы разместить свой код в песочнице, например repl.it/languages/reactjs, чтобы вам было легче помочь?

Eduardo Junior 16.03.2019 22:27
Поведение ключевого слова "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) для оценки ваших знаний,...
0
1
4 517
2

Ответы 2

Вам нужно, чтобы ваш модальный компонент вызывал обратный вызов onClose, чтобы родитель мог его закрыть:

import React, { Component } from 'react';
  import AddModal from './addmodal';

  class Page extends Component {
    constructor(){
      super();
      this.state = { isModalOpen: false };
    }
    ...//skip
    handleAdd= () =>{
      this.setState({ isModalOpen: true });
    }
    handleClose= () =>{
      this.setState({ isModalOpen: false });
    }
    render(){
      return (
        <div>
          <button onClick = {this.handleAdd} > Add </button>
          <AddModal isOpen = {this.state.isModalOpen} handleClose = {this.handleClose}/>
        </div>
        )
    }
  }


  import React, { Component } from 'react';

  class AddModal extends Component {
    // ... skip

    render(){
      return(
        <modal inOpen = {this.props.isOpen} >
        <Button onClick = {this.props.handleClose}> // call to parent
          Okay
        </Button>
          ...//skip
        </modal>
      )
    }
  }

  export default AddModal;

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

Основываясь на том, что опубликовал @jsdeveloper, я думаю, вы можете избавиться от беспорядка, используя одну и ту же функцию для обработки открытия и закрытия модального окна.

Мы будем использовать функцию toggleModal, которая изменяет isModalOpen на true, когда это false, и наоборот. Он использует обратный вызов, который принимает значение предыдущего состояния isModalOpen.

toggleModal = () => {
  this.setState(prevState => ({
    isModalOpen: !prevState.isModalOpen
  }))
}

Итак, окончательный файл должен выглядеть примерно так.

import React, { Component } from 'react';
import AddModal from './addmodal';

class Page extends Component {
  constructor() {
    super();
    this.state = {
      isModalOpen: false
    };
  }
  // ... //skip
  toggleModal = () => {
    this.setState((prevState) => ({
      isModalOpen: !prevState.isModalOpen
    }));
  };

  render() {
    return (
      <div>
        <button onClick = {this.handleAdd}> Add </button>{' '}
        <AddModal
          isOpen = {this.state.isModalOpen}
          toggleModal = {this.toggleModal}
        />
      </div>
    );
  }
}

import React, { Component } from 'react';

class AddModal extends Component {
  // ... skip

  render() {
    return (
      <modal inOpen = {this.props.isOpen}>
        <Button onClick = {this.props.toggleModal}>Close</Button>
        //... skip
      </modal>
    );
  }
}

export default AddModal;

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