Мне нужно обновить контекст после завершения запроса ajax. Я использую архитектуру потока, и все работает до такой степени, что когда мой компонент уведомляется об обновлении, мне нужно установить новый контекст.update responsejs контекст после завершения запроса ajax с архитектурой потока
Простой demostration:
У меня есть родительский компонент, который генерирует контекст путем вызова магазина. Магазин получает данные после того, как запрос ajax инициализируется где-то еще. Как это:
RowAPI.ajaxGetAllRows();
Тогда у меня есть компонент, который содержит контекст:
let ParentComponent = React.createClass({
childContextTypes: {
rows: React.PropTypes.object
},
getChildContext: function() {
return {
rows: RowStore.getAllRows(),
};
},
componentDidMount: function() {
RowStore.addChangeListener(this._onRowsChanged);
},
componentWillUnmount: function() {
RowStore.removeChangeListener(this._onRowsChanged);
},
render() {
return (
<ChildComponent />
);
},
_onRowsChanged: function() {
//Now we need to update context
}
});
Теперь, поскольку мы слушаем изменения строк, мы получим обновление, когда наш запрос Ajax закончил и поставить данные в наш магазин. Теперь нам нужно получить эти данные и установить их как контекст. Это проблема.
Это мой дочерний компонент, который использует контекст. Я знаю, что я просто могу передать строки в качестве реквизита для моего ребенка, но это всего лишь пример, и в моем реальном сценарии у меня много детей, которым нужно будет пройти реквизит.
let ChildComponent = React.createClass({
contextTypes: {
rows: React.PropTypes.object
},
render() {
return (
<div style={styles.wrapper}>
{this.context.rows}
</div>
);
},
});
Заранее благодарен!
Вы пытались использовать состояние, которое обновляется через _onRowsChanged? Таким образом, вы можете использовать что-то вроде this.state.rows вместо RowStore.getAllRows(); – bmartin
Спасибо, что это сработало, никогда не думал, что он переделает весь контекст, когда состояние изменится, мысль только рендер будет вызываться: S. Это что-то вроде взлома или это правильный способ сделать это? Можете ли вы опубликовать его, чтобы я мог отметить его как правильный ответ? еще раз спасибо –