Пробую react.js, пока все нравится, но возник вопрос по проектированию архитектуры.
Допустим, есть приложение со вложенными компонентами.
App > ItemsList > Item > ActiveElement
Где, App - главный компонент (стрелочкам указан уровень вложенности), ActiveElement - крайний дочерний элемент, предполагающий взаимодействие с пользователем.
Вся логика находится в App, дочерние компоненты формируются на основе переданных props. Вроде как классическая схема, но, мне не очень нравится проксировать функции через всю цепочку потомков от App до ActiveElement, если последний, к примеру, при клике, должен изменить в App какой-то state.
То есть, выглядит это примерно так:
var App = React.createClass({
getInitialState: function(){
return {
option: false
};
},
onToggleOption: function(){
var option = this.state.option;
option = !option;
this.setState({option: option});
},
render: function(){
return <ItemsList onToggleOption={this.onToggleOption} />
}
});
var ItemsList = React.createClass({
render: function(){
return <Item onToggleOption={this.props.onToggleOption} />
}
});
var Item = React.createClass({
render: function(){
return <ActiveElement onToggleOption={this.props.onToggleOption} />
}
});
var ActiveElement = React.createClass({
render: function(){
return <button onClick={this.props.onToggleOption}>Click me</button>
}
});
Здесь, мы проксируем функцию onToggleOption для кнопки, через всех ее родителей. Если таких кнопок и/или родителей будет много, подобное занятие может вызвать неслабый дискомфорт.
Первое, что приходит на ум, сделать ссылку на родительский класс App и обращаться в дочерних элементах к нужным функциям непосредственно через нее.
var AppLink = null;
var App = React.createClass({
getInitialState: function(){
return {
option: false
};
},
componentDidMount: function(){
AppLink = this;
},
//...
});
//...
var ActiveElement = React.createClass({
render: function(){
return <button onClick={AppLink.onToggleOption}>Click me</button>
}
});
Собственно, интересует, есть ли какие-то очевидные или не очевидные минусы такого подхода. Или может быть есть более правильный подход, как упростить связывание компонентов?