Получить данные из дочернего компонента в ответ в родительском

У меня есть базовый компонент, чья функция рендеринга выглядит следующим образом

    <QuestionsDrawer open={this.state.drawerOpen} onClose={this._toggleDrawer}>
      <Search />
      <QuestionList
        questions={this.state.rowData}
        selected={[]}
        ref={ref => (this.listItem = ref)}
      />
    </QuestionsDrawer>

Когда ящик закрыт this._toggleDrawer функция называется.

_toggleDrawer = () => {
  console.log("selected", this.listItem._fetchSelected());
  this.setState(prevState => ({
    drawerOpen: !prevState.drawerOpen,
  }));
};

Когда это произойдет, я хотел бы получить данные из QuestionList составная часть. я пытался refs но я получаю Cannot read property '_fetchSelected' of undefined ошибка.

Это то, что функция в QuestionList компонент выглядит

_fetchSelected = () => {
  return this.state.selected;
};

Что здесь не так и есть ли лучший способ реализовать это?

1 ответ

Вы можете создать метод в родительском компоненте и передать его через реквизиты дочернему компоненту. Этот метод может принимать аргумент, когда вы отправляете this.state.selected от вашего дочернего компонента. Ваш родительский компонент получит доступ к этим данным из метода.

Я сделал быструю визуализацию кода ниже и надеюсь, что вы поняли идею.

// Callback function in the parent that gets passed
// by props to QuestionList

const questionListCallback = (dataFromQuestionList) => {
  // Do something with the data from QuestionList here
}

<QuestionsDrawer open={this.state.drawerOpen} onClose={this._toggleDrawer}>
  <Search />
  <QuestionList
    questions={this.state.rowData}
    drawerOpen={this.state.drawerOpen}
    callbackFromParent={this.questionListCallback}
    selected={[]}
    ref={ref => (this.listItem = ref)}
  />
</QuestionsDrawer>


// Below is for the QuestionList component
// If you for example want to grab the data in componentDidUpdate

componentDidUpdate(prevProps, prevState) {
  // Do something to get the data here and store it somewhere
  // Maybe in the state in the child?
  if (!this.props.drawerOpen && prevState.data !== this.state.data) {
    this.setState({ data: data}, () =>{
      callbackFromParent(data);
    })
  }
}
Другие вопросы по тегам