Получить данные из дочернего компонента в ответ в родительском - PullRequest
0 голосов
/ 03 декабря 2018

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

    <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 Ответ

0 голосов
/ 03 декабря 2018

Вы можете создать метод в родительском компоненте и передать его через реквизиты дочернему компоненту.Этот метод может принимать аргумент, в который вы отправляете 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);
    })
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...