#reactjs #react-router #state #parent
#reactjs #react-router #состояние #родительский
Вопрос:
У меня есть модель маршрута, созданная в react-router. Я хочу знать, как передавать реквизиты между моими компонентами в этой настройке — возможно ли это?
<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>
Скажем, например, я инициализирую свое состояние в компоненте макета (идея заключается в том, что все его дочерние элементы могут получить доступ к состоянию); как бы я передал им значение состояния, а также запустил функции в родительском компоненте, передаваемые через props?
Возможно ли это, как это было бы, если бы компонент был непосредственно вложен в его родительский элемент, или я неправильно думаю об этом в отношении маршрутизации? Если да, есть ли альтернативное решение?
Любая помощь приветствуется
Комментарии:
1. Возможно, вы захотите изучить возможность использования redux для этого.
2. Спасибо, я так и подозревал. Еще не начал с redux, но сейчас, вероятно, самое время запачкать руки 🙂
Ответ №1:
Да, это возможно. Вы можете использовать контекст в Layout
компоненте. Вот пример в 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
}
}
Комментарии:
1. Спасибо, но, прочитав официальные документы, он, похоже, настоятельно рекомендует отказаться от этой функции: а) поскольку API, вероятно, будет обновлен, и б) это затрудняет понимание вашего кода (не уверен, почему именно так, но я поверю им на слово!). Есть ли более стабильный способ добиться этого? Например, было бы проще использовать Redux для этого?
2. Ну, я не думаю, что есть какой-либо другой способ инициализировать состояние в Layout и передать переменную дочерним элементам Layout. Поскольку дочерние компоненты уже были созданы до создания экземпляра
Layout
so, react-router может передать их вLayout
asprops.children
.