【发布时间】:2016-02-05 17:05:54
【问题描述】:
假设我有一个依赖于 Flux 的应用程序。
大多数 Flux 教程告诉您,您的 Components 应该在 Store 上侦听 change 事件并相应地呈现数据。这种方法非常适合小而简单的用例,但是我在稍微复杂一点的场景中遇到了问题:
我有一个可以按居住城市(华盛顿、纽约等)过滤的客户列表。此列表在 url /customers/by-city 下可用,可以用以下代码表示:
var CustomersList = React.createClass({
getInitialState() {
return {
city: 'Washington',
customers: []
};
},
componentWillMount: function() {
CustomersActions.retrieveForCity(this.state.city);
CustomersStore.on('change', this.handleNewData);
},
componentWillUnmount: function() {
CustomersStore.off('change', this.handleNewData);
},
render: function() {
return <FilteredTable filters={['city']}
onCityChange={this.handleCityChange}
data={this.state.customers} />;
},
handleCityChange: function(state) {
CustomersActions.retrieveForCity(this.state.city);
this.setState({city: city});
},
handleNewData: function(customers) {
this.setState({customers: customers});
}
});
每次我想按不同城市过滤时,CustomersActions 发出 AJAX 请求,响应转到Dispatcher。 CustomersStore 然后拿起它,存储为 data,并发出 change 事件。几乎是标准 Flux 的东西。
现在,据我了解,没有办法将 change 事件与其实际所做的事情联系起来。所以想象一下下面的场景:
- 我通过
San Francisco过滤表格 - 我改变了主意,在 AJAX 请求完成之前,我点击了一些导航链接(由 react 处理,没有页面重新加载),我最终访问了一个不同的 url,例如
/customers/shortlisted。此 URL 下还有另一个组件:ShortlistedCustomers。 -
ShortlistedCustomers类似于CustomersList- 为了显示数据,它通过CustomerActions发出 ajax 请求并在CustomersStore上侦听change事件 - 现在的技巧部分 - 第二个 ajax 请求在第一个之前完成,发出两个
change事件,用户最终在他的表中得到错误的数据
如何“正确”解决这个问题?我对最简单的解决方案感兴趣,也许是 FB 人自己推荐的?我意识到我可以例如取消第一个 AJAX,或者只按照发出这些请求的顺序处理响应,但这很快就会失控。
请注意,此问题并非针对此案例,而是一个更普遍的问题。例如。如果我想添加更多方式来触发 AJAX 请求,或者更多依赖于同一个 Store 的组件,则该解决方案应该适用。
【问题讨论】:
-
“我转到我的应用程序中的另一个组件” --- 这个“go”实际上是如何表示的?
-
我更新了我的问题 - 这个“go”可能是 react-router 或类似的东西;如果这就是您的意思,则不会重新加载页面
-
"在您当前的代码中,您从一个具有 2 个属性的对象开始,然后将其替换为具有一个属性的对象。"
setState()的第一个参数是差异,而不是新状态;所以它被合并到现有状态中 -
facebook.github.io/react/docs/component-api.html
setState() Performs a shallow merge of nextState into current state -
天哪,我一直认为它每次都会替换整个对象:-S 道歉
标签: javascript reactjs flux