【发布时间】:2016-05-26 04:56:54
【问题描述】:
事件(DOM 事件或系统事件)是否与操作具有 1:1 的关系?即一次点击事件应该只触发一个动作吗?
例如,假设我们有一个显示 10 行和 2 列的表格的页面。每行都有一个 Product 字段和一个 Amount 字段。 Amount 字段有一个范围输入,范围为 [0, 10]。用户可以单独设置每个产品的数量。
用户还可以通过使用 2 个按钮获得 2 个选项。
- 按下第二个按钮将禁用表中除第一个产品之外的所有产品(有效地将其数量设置为 0,并且用户无法再与它们交互以设置其数量)。让我们称之为
Option B - 按第一个按钮会启用第一个之后的所有产品(默认情况下,将每个产品的数量设置为 1),用户可以再次与它们交互,单独设置它们的数量。我们称之为
Option A。
这个“应用”的状态由这个简单的对象描述
state = {
option : <String>,
products : [
{
name : <String>,
amount : <Integer>
}, ...
]
}
我们还有这 4 个简单的动作创建者:
function setOption(option) {
return { type : 'SET_OPTION', option : option};
}
function incAmount(productName) {
return {
type : 'INCREMENT_AMOUNT',
product : productName
}
}
function decAmount(productName) {
return {
type : 'DECREMENT_AMOUNT',
product : productName
}
}
function setAmount(productName, amount) {
return {
type : 'SET_AMOUNT',
payload : { product : productName, amount : amount }
}
}
为了简单起见,我们只有一个 reducer。
在本例中,选择Option B 应该会对状态产生以下影响:
- 将
option更改为B - 将第一个之后的每个
product的数量设置为0
选择Option A 应该分别对状态产生以下影响:
- 将
option更改为A - 将第一个之后的每个
product的数量设置为1
增加产品A的数量应该对状态产生以下影响:
- 将产品 A 的数量增加 1
实现这些更改的正确方法是什么?
a) 让option 按钮的onClick 处理程序执行以下操作:
- 触发
store.dispatch(setOption(option)) - 对于第一个触发后的每个产品,
store.dispatch(setAmount(productName, amount))(amount= 选项 A 为 1,选项 B 为 0)
b)让option 按钮的onClick 处理程序执行以下操作:
-
触发
store.dispatch(setOption(option))并让减速器将第一个产品之后的每个产品的
option和amount更改为指定数量(amount= 选项 A 为 1,选项 B 为 0)
如果我们使用 a),reducer 的 switch (action) {} 语句中的每个案例只处理状态的一个方面,但我们必须从一个 click 触发多个动作事件
如果我们使用 b),我们只会从 click 事件中触发一个动作,但减速器中 SET_OPTION 的情况不仅会更改 option,还会更改 amount产品。
【问题讨论】:
标签: javascript events action redux