Redux - 繁重的工作应该在哪里发生 - 化简器,动作,容器或表示组件
Redux -- where should the heavy lifting happen -- reducer, action, container, or presentation component?
我一直在尝试实现这里教授的容器/表示组件范式。但是,我对我的一些代码应该去哪里有点困惑。
假设我有一个简单的项目列表。单击一个项目时,应将其从列表中删除。修改列表的代码应该放在我的化简器、操作创建器、容器组件还是表示组件中?
还原剂:
case 'REMOVE_ITEM':
return Object.assign({}, state, {items: action.value})
动作创建者:
export function removeItem(items) {
return {
type: 'REMOVE_ITEM',
value: items
};
}
现在我们的容器组件:
import ItemsList from './ItemsList';
import { connect } from 'react-redux';
import * as actions from './actions';
var mapStateToProps = function(state) {
return {
items: state.itemsList.items
};
};
var mapDispatchToProps = function(dispatch) {
return {
onItemClicked: function(items) {
dispatch(actions.removeItem(items));
}
};
};
var ItemsListContainer = connect(
mapStateToProps,
mapDispatchToProps
)(ItemsList);
module.exports = ItemsListContainer;
最后是表现组件:
import React from 'react';
module.exports = React.createClass({
showRows: function() {
return this.props.items.map(item => {
return (
<li key={item.id} onClick={this.props.onItemClicked}>{item.title}</li>
);
});
},
render: function() {
return (
<ul>
{this.showRows()}
</ul>
);
}
});
然后,在某些时候,我们需要一些代码来删除列表项。单击该项目时,我们需要将其从项目列表中拼接。该代码应该去哪里?
我可以看到它在表示组件中,然后在修改列表后从容器组件调用 onItemClicked 回调。
我可以看到它在容器组件中,因此表示组件尽可能愚蠢。不过,我需要一种方法来访问状态(以获取项目),并且由于我已经将项目作为道具传递到表示组件中,因此在那里这样做对我来说更有意义。
我可以看到它在动作创建器中,删除的项目作为 removeItem 函数的第二个参数。
把它放在化简器中似乎是一个坏主意,因为做一堆计算(修改数组)似乎是应该在调度操作之前而不是之后发生的事情。
修改阵列的繁重工作应该在哪里发生?似乎它应该放在表示组件中,但我知道这些应该是愚蠢的组件......
你应该这样想:
DumbComponent (查看/接受输入) -> SmartComponent (通过触发调度来响应输入) -> ActionCreator (创建必要的操作,在必要时提供有效负载 - 在这种情况下,您需要过滤掉的索引) -> Reducer(通过修改和返回新状态来响应操作。
在减速器中,您将执行以下操作:
return Object.assign({}, state, { items: state.items.filter((item, index) => index !== payload) });
在化简器中进行计算/繁重的工作也是如此,如果它修改了状态,代码应该是修改状态的地方。
- Ember.js(v2.4.5)组件不是't错过第二个动作
- Redux - 繁重的工作应该在哪里发生 - 化简器,动作,容器或表示组件
- Ember单元测试具有冒泡动作的组件
- 在组件动作中更改URL
- React/Flux:从组件的渲染方法中触发一个动作,或者从组件中执行一个Rest调用
- 如何从MVC控制器文件中使用查询组件选择extjs网格动作列
- Ember.js:控制器动作没有被'sendAction'从一个组件
- Facebook图形api和新定义的对象和动作:消息:"未知路径组件"
- 从Ember 2.0组件调用控制器动作
- Emberjs的partial's动作在组件中不触发
- 为React可重用组件设计Redux动作和reducer
- Ember.js在component' js文件中给组件分配动作
- 从组件到路由的动作不再冒泡(Ember 1.13)
- 如何处理动作“发送”;通过Ember组件包装视图或视图的控制器
- 余烬:从组件到应用控制器的气泡动作
- 如何从Ember组件发送动作到包装它的View
- Ember.js -打开模式的动作不会弹出组件
- Ember:动态创建组件动作don'不要开火
- 使用Ember组件中的Morris.js图,使用自定义对象从组件到控制器的气泡动作事件
- Redux:组织容器、组件、动作和化简器