Доступ к родительскому состоянию у ребенка в Реаге

У меня есть (например) два компонента в React. Первый, app.js, является корневым компонентом. Он импортирует некоторые данные JSON и помещает его в свое state. Это прекрасно работает (я вижу это в React devtools).

import data from '../data/docs.json';

class App extends Component {
  constructor() {
    super();
    this.state = {
      docs: {}
    };
  }
  componentWillMount() {
    this.setState({
      docs: data
    });
  }
  render() {
    return (
      <Router history={hashHistory}>
        <Route path="/" component={Wrapper}>
          <IndexRoute component={Home} />
          <Route path="/home" component={Home} />
          <Route path="/docs" component={Docs} />
        </Route>
      </Router>
    );
  }
}

Второй, docs.js, предназначен для отображения данных JSON. Для этого ему необходимо получить доступ к state app.js На данный момент это ошибки, и я знаю, почему (this не включает app.js). Но как тогда я могу передать state из app.js в docs.js?

class Docs extends React.Component {
    render() {
        return(
            <div>
                {this.state.docs.map(function(study, key) { 
                    return <p>Random text here</p>; 
                })}
            </div>
        )
    }
}

Ответы

Ответ 1

Правильный способ сделать это - передать состояние в качестве props компонента Docs.

Однако, поскольку вы используете React Router нему можно получить доступ несколько иначе: this.props.route.param вместо default this.props.param

Таким образом, ваш код должен выглядеть примерно так:

<Route path="/docs" component={Docs} docs={this.state.docs} />

а также

{this.props.route.docs.map(function(study, key) { 
    return <p>Random text here</p>; 
})}

Ответ 2

Другой способ сделать это:

<Route path="/docs" component={() => <Docs docs={this.state.docs}/>}>

Если вам нужно пройти детей:

<Route path="/" component={(props) => <Docs docs={this.state.docs}>{props.children}</Docs>}>

Если вы делаете это так, то вы можете получить доступ к своим реквизитам напрямую с помощью this.props.docs в Child Component:

{
    this.props.docs.map((study, key)=> { 
       return <p key={key}>Random text here</p>; 
    })
}

Ответ 3

Другой способ сделать это будет

        <Route path='/' render={ routeProps => <Home 
            {...routeProps} 
            docs={this.state.docs}
            /> 
          } 
        />

В дочернем компоненте вы можете обращаться к docs используя

this.props.docs

Надеюсь, поможет!