@vilix

Как правильно менять состояние потомка (или вызывать функции) из родителя в React.Js?

Как правильно менять состояние потомка (или вызывать функции) из родителя в React.Js?

Этот вопрос возник при реализации следующей логики:
есть кнопка "регистрация" при нажатии на которую должно появиться диалоговое окно с полями для регистрации и кнопкой "подтвердить". При нажатии кнопки "подтвердить" мне нужно выполнить например функцию signup в конце которой мне нужно закрыть это диалоговое окно.

Моя текущая реализация с использованием react-bootstrap:

ModalInstance.js:
import React from 'react';
import { Button, Modal } from 'react-bootstrap';

const ModalInstance = React.createClass ({
  
  getInitialState() {
    return { showModal: false };
  },

  close() {
    this.setState({ showModal: false });
  },

  open() {
    this.setState({ showModal: true });
  },

  render() {
    return (
      <div id={this.props.id}>
        <Button bsStyle="primary" onClick={this.open}>{this.props.buttonName}</Button>
        <Modal ref="modal" show={this.state.showModal} onHide={this.close}>
          <Modal.Header closeButton>
            <Modal.Title>{this.props.title}</Modal.Title>
          </Modal.Header>
          <Modal.Body>
            {this.props.children}
          </Modal.Body>
        </Modal>
      </div>
    );
  }
})

module.exports = ModalInstance;


header.js:
...
const Header = React.createClass ({
  signup() {
    ...
    let modal = this.refs.modal;
    modal.close();
  },
render() {
               ...
              <ModalInstance
                ref="modal" 
                id="signupModalButton" 
                title="Sign up"
                buttonName="Sign up">
                  <form>
                    ...
                    <Button bsStyle="primary" onClick={this.signup}>Sing up</Button>
                  </form>
              </ModalInstance>
}


Смущает, то что я использую refs, в документации советуют избегать использования этого механизма для понятного data-flow. Насколько анти-патерно мое решение и как сделать это в стиле react way?

Будет ли более правильным подходом сделать например в header showModal состояние и передавать его в modalinstance через props и использовать его в getInitialState()?
  • Вопрос задан
  • 3167 просмотров
Решения вопроса 1
@Roman_Kh
Сделайте компонент SignupModal, который будет представлять модальное окно для регистрации со всеми параметрами и кнопками. А в него потом передавайте функцию для вызова при нажатии на кнопку.
class SignupModal ... {
   ...
   handleSignupButton(){
      // do something
      if(this.props.onSignup)
        this.props.onSignup()
   }

   render(){
       ...
       <Button .... onClick={this.handleSignupButton} />
       ...
   }
}

class SomeComponent ... {
   ...
   handleSignup(){
      // do something
   }

   render(){
      ...
     <SignupModal ... onSignup={this.handleSignup} />
      ...
   }
   ...
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы