я читал на http://scotch.io/tutorials/javascript/build-a-real-time-twitter-stream-with-node-and-react-js и описывает способ взять на сервере оказанного React компоненты легко:Установки начального состояния в React компонентов для прогрессивного улучшения и архитектуры Flux
сервера предоставляет в {{{разметки}}} в рулях и передать начальное состояние.
<section id="react-app">{{{ markup }}}</div>
<script id="initial-state" type="application/json">{{{state}}}</script>
Тогда на стороне клиента Javascript
/** @jsx React.DOM */
var React = require('react');
var TweetsApp = require('./components/TweetsApp.react');
// Snag the initial state that was passed from the server side
var initialState = JSON.parse(document.getElementById('initial-state').innerHTML)
// Render the components, picking up where react left off on the server
React.renderComponent(
<TweetsApp tweets={initialState}/>,
document.getElementById('react-app')
);
Но в потоке архитектуры, например, как описано в этой статье http://scotch.io/tutorials/javascript/creating-a-simple-shopping-cart-with-react-js-and-flux, состояние инициализируется в методе getInitialState жизненного цикла:
// Method to retrieve state from Stores
function getCartState() {
return {
product: ProductStore.getProduct(),
selectedProduct: ProductStore.getSelected(),
cartItems: CartStore.getCartItems(),
cartCount: CartStore.getCartCount(),
cartTotal: CartStore.getCartTotal(),
cartVisible: CartStore.getCartVisible()
};
}
// Define main Controller View
var FluxCartApp = React.createClass({
// Get initial state from stores
getInitialState: function() {
return getCartState();
},
// Add change listeners to stores
componentDidMount: function() {
ProductStore.addChangeListener(this._onChange);
CartStore.addChangeListener(this._onChange);
},
// Remove change listers from stores
componentWillUnmount: function() {
ProductStore.removeChangeListener(this._onChange);
CartStore.removeChangeListener(this._onChange);
},
// Render our child components, passing state via props
render: function() {
return (
<div className="flux-cart-app">
<FluxCart products={this.state.cartItems} count={this.state.cartCount} total={this.state.cartTotal} visible={this.state.cartVisible} />
<FluxProduct product={this.state.product} cartitems={this.state.cartItems} selected={this.state.selectedProduct} />
</div>
);
},
// Method to setState based upon Store changes
_onChange: function() {
this.setState(getCartState());
}
});
module.exports = FluxCartApp;
Какой из них является правильным подходом к установлению состояния с точки зрения прогрессивного улучшения?
Не по теме, но почему вас волнует, что конкретно изменилось в магазине? То, что мне больше всего нравится в реакции/потоке, заключается в том, что мне не нужно заботиться о том, что конкретно изменилось. – Esailija
Возможно, это просто подходит для моего проекта, но я работаю с выделенными базами и веб-сайтами. Время от времени я получаю что-то на websocket clientside. У меня есть несколько смонтированных компонентов, которые связаны с этим магазином, но не нужно ничего знать об этом конкретном испускании. –
Почему у вас есть компонент, слушающий магазин, из которого он не получает никаких данных? – Esailija