Метод компонента Fire из другого компонента на ReactJs

У меня есть такие компоненты:

class DashTopNav extends React.Component {
  constructor(props) {
    super(props);
  }
  render(){
    return(<button></button>);
  }
}
class FltBox extends React.Component {
  constructor(props) {
    super(props);
  }

  methodToFired(){
  }
}

class XDashBoard extends React.Component {
    constructor(props) {
    super(props);
  }
  render(){
    return(<div className = "XDashBoard">
        <DashTopNav onClick = {call methodToFired on FltBox}  />
        <FltBox />
    </div>);
  }
}

Я хочу вызвать метод на FltBox (methodToFired) с помощью кнопки на DashTopNav, но я не могу найти способ вызвать функцию дочернего компонента из другого дочернего компонента.

было бы лучше поместить methodToFired в DashTopNav, так как вы не используете его в FltBox, верно?

Amr Aly 02.05.2018 02:15

Нет, потому что мне нужно что-то извлечь во FltBox при нажатии кнопки на DashTopNav: /

Phoxer 02.05.2018 21: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
2
360
3

Ответы 3

Скорее всего, это нет, что вы хотите делать.

Мне кажется, что вы хотите извлечь methodToFired из компонента FltBox в свой компонент XDashBoard, поскольку он кажется универсальным типом метода и передать его в качестве опоры вашему компоненту DashTopNav или использовать шаблон Flux для запуска действия из ваш DashTopNav, на который затем отвечает ваш FltBox.

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

class DashTopNav extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    return(<button {...this.props}>Button</button>);
  }
}

class XDashBoard extends React.Component {
  constructor(props) {
    super(props);
  }

  methodToFired (e) {
    console.info('fired');
  }

  render() {
    return(
      <div className = "XDashBoard">
        <DashTopNav onClick = {this.methodToFired} />
      </div>
    );
  }
}

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

В вашем примере вы можете передать метод класса из родительского компонента в DashTopNav.onClick и изменить реквизиты FltBox внутри этой функции, заставив FltBox повторно отрисовывать и обновлять, когда пользователь щелкает DashTopNav. Если конечный результат FltBox может быть получен непосредственно из этого изменения реквизита, тогда функции render достаточно, если вам нужно выполнить побочный эффект в качестве реакции на изменение реквизита, тогда вы можете использовать методы жизненного цикла React, такие как didComponentUpdate.

Например:

class DashTopNav extends React.Component {
  constructor(props) {
    super(props);
  }

  render(){
    return(<button></button>);
  }
}

class FltBox extends React.Component {
  constructor(props) {
    super(props);
  }

  didComponentUpdate() {
    // Handle navButtonClick update 
  }
}

class XDashBoard extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
       navButtonClick: false 
    };
  }

  handleNavClick = () => {
     this.setState({navButtonClick: true});
  }

  render(){
    const {navButtonClick} = this.state;

    return(
      <div className = "XDashBoard">
        <DashTopNav onClick = {this.handleNavClick}  />
        <FltBox navButtonClick />
      </div>
    );
  }
}

Вы можете использовать реф.

Используя ссылки, мы можем получить доступ к узлам DOM или элементам React, созданным в методе рендеринга, в этом примере мы будем использовать ссылки для доступа к элементу, который содержит methodToFired в компоненте FltBox, мы будем использовать элемент div, таким образом, мы можем получить доступ к methodToFired.

затем мы будем использовать эту ссылку для элемента div и передать ее любому компоненту, который мы хотим, в нашем случае DashTopNav в качестве опоры, которая является onClick = {this.parentClickHandler}

class FltBox extends React.Component {
  constructor(props) {
    super(props);
  }

  methodToFired(){
    alert('Fired from FltBox')
  }
  
  // here we use ref to access to the div element
  render() {
  	return (<div ref = {div => this.div = div}></div>);
  }
}

class DashTopNav extends React.Component {
  constructor(props) {
    super(props);
  }
  
  render(){
    return (
    <button onClick = {this.props.onClick}>Submit</button>
    );
  }
 }
 
 class XDashBoard extends React.Component {
  constructor(props) {
    super(props);
    this.parentClickHandler = this.parentClickHandler.bind(this)
  }
  parentClickHandler() {
    this.mydiv.methodToFired();
  }
  render(){
    return(<div className = "XDashBoard">
        <DashTopNav onClick = {this.parentClickHandler}  />
        <FltBox ref = {div => this.mydiv = div}/>
    </div>);
  }
}

ReactDOM.render(<XDashBoard />, document.querySelector("#app"))
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id = "app"></div>

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