好吧,Reflux的作者说他已经删除了调度员,将其整合在行动本身,以及他多么厌恶比较字符串和类型比较(假设 - 用于不同的行动区分)
我只是需要在调用之后添加多个动作并对它们进行单独处理。在这个过程中,我最终在组件中进行了相同的action.type
比较,而不是创建者。
作为一个例子,我将讨论两个必须执行上述操作的场景,
我有一个规则列表,我通过点击某个按钮组件添加这些规则 - group-buttons
层次结构 -
同时在list
下我有rule-cards
组件
列表
附上截图。
我的代码
操作文件
var Reflux = require('reflux');
module.exports = Reflux.createActions(['addRule', 'removeRule']);
在 GroupButtons 组件内
Actions.addRule(item);
我的商店
var Reflux = require('reflux');
var Actions = require('../actions/rules');
var CampaignAudienceStore = Reflux.createStore({
init: function(){
this.state = {
type: 'ADD_RULE'
};
this.listenTo(Actions.addRule, this.handleAdd);
this.listenTo(Actions.removeRule, this.handleRemove);
},
handleAdd(rule){
this.state.type = 'ADD_RULE';
this.state.rule = rule;
this.trigger(this.state);
},
handleRemove(name){
this.state.type = 'REMOVE_RULE';
this.state.name = name;
this.trigger(this.state);
}
});
module.exports = CampaignAudienceStore;
并在我的列表
中componentDidMount(){
this.unsubscribe = CampaignAudienceStore.listen(this.ruleClick);
this.fetchData();
},
componentWillUnmount(){
this.unsubscribe();
},
ruleClick: function(state) {
switch (state.type){
case 'ADD_RULE':
var rules = this.state.rules;
rules.push(state.rule);
this.setState({rules: rules});
break;
case 'REMOVE_RULE':
var rules = this.state.rules;
for (var i = 0; i < rules.length; i++) {
if (rules[i].name === state.name ) {
rules.splice(i, 1);
break;
}
}
this.setState({rules});
default:
break;
}
},
这让我想到了Redux和Reflux之间基本上存在差异的问题。最后我必须检查action.type。
如果我偏离了我的实施,这是正确的方法吗?
如果不是,那么作者在提及时的意思是什么
在Reflux中,我决定将调度员移动到行动中
官方链接 - http://spoike.ghost.io/deconstructing-reactjss-flux/
第二种方法 -
处理存储中的数据,处理存储本身中的操作并在其后触发状态更改。在组件本身中
通过更新任何状态变量来进行黑客攻击
componentDidMount() {
this.unsubscribe = Store.listen(() => FormUtil.setState(this, 'show', !this.state.show));
},
第二种方法中的问题只是我在组件中的任何地方都没有使用this.state.show,只是更新它以触发组件本身的重新渲染。
请问?
答案 0 :(得分:0)
数据实际上应存储在商店中。
var CampaignAudienceStore = Reflux.createStore({
init: function(){
this.state = {
rules: []
};
this.listenTo(Actions.addRule, this.handleAdd);
this.listenTo(Actions.removeRule, this.handleRemove);
},
handleAdd(rule){
this.state.rule.push(rule);
this.trigger(this.state);
},
handleRemove(name){
this.state.rules = this.state.rules.filter(function (rule) {
return rule.name != name;
});
this.trigger(this.state);
}
});
并且当触发此状态更改时,您的List组件将重新呈现。
render: function () {
var rules = this.state.rules.map((r) => <ListItem props={r}/>);
return <ul>{rules}</ul>
}
或类似的东西。