2016-10-11 7 views
1

У меня есть модель маршрута, составленная в ответном маршрутизаторе. Я хочу знать, как передавать реквизит между моими компонентами в этой настройке - возможно ли это?Как передать реквизиты дочерним компонентам в дереве реактивного маршрутизатора

<Route path='/' component={Layout}> 
     <IndexRoute component={Home} /> 
     <Route path='/users' component={Users} /> 
     <Route path='/posts' component={Posts} /> 
     <Route path='/albums' component={Albums} /> 
     <Route path='/about' component={About} /> 
    </Route> 

Скажет, например, я инициализирую свое состояние в компоненте Layout (идею в том, что все это дети могут получить доступ к государству); как передать значение состояния им, а также запустить функции в родительском компоненте, переданном через реквизиты?

Возможно ли это, как если бы компонент был непосредственно вложен в его родительский элемент, или я думаю об этом неправильно в отношении маршрутизации? Если да, есть ли альтернативное решение?

Любая помощь по оценке

+0

Вы можете посмотреть в использовании [перевождь] (http://redux.js.org /) для этого. – Wex

+0

Спасибо, я подозревал. Еще не начали с redux, но теперь, наверное, настало время, чтобы мои руки были грязными :) – Paulos3000

ответ

2

Да, это возможно. Вы можете использовать context в компоненте . Вот пример в ES6:

export default class Layout extends React.Component { 

    static childContextTypes = { 
     layoutState: React.PropTypes.object 
    } 

    getChildContext() { 
     return {layoutState: this.state}; 
    } 

} 

Тогда просто объявить контекст в дочерних компонентов/внучатые:

export default class Users extends React.Component { 

    static contextTypes = { 
     layoutState: React.PropTypes.object 
    } 

    render() { 
     const {layoutState} = this.context; 
     // then just use your layoutState and return 
    } 
} 
+0

Спасибо, но, прочитав официальные документы, кажется, настоятельно рекомендую против этой функции: а) поскольку API, вероятно, будет обновлен, и b) это делает ваш код сложнее понять (точно не знаю, почему это так, но я возьму их слово для этого!). Есть ли более стабильный способ достижения этого? Например, было бы проще использовать Redux для этого? – Paulos3000

+0

Ну, я не думаю, что вы можете инициализировать состояние в макете и передать переменную макетам. Поскольку дочерние компоненты уже были созданы для создания экземпляра «Layout», так что «agent-router» может передать их «Layout» в качестве «props.children». –

Смежные вопросы