【发布时间】:2017-10-01 05:28:36
【问题描述】:
我正在查看Redux tutorial,其中正在讨论以下减速器:
function visibilityFilter(state = 'SHOW_ALL', action) {
return action.type === 'SET_VISIBILITY_FILTER' ?
action.filter :
state
}
function todos(state = [], action) {
switch (action.type) {
case 'ADD_TODO':
return state.concat([{
text: action.text, completed: false
}]);
case 'TOGGLE_TODO':
return state.map((todo, index) =>
action.index === index ?
{ text: todo.text, completed: !todo.completed } :
todo
)
default: return state;
}
}
function todoApp(state = {}, action) {
return {
todos: todos(state.todos, action),
visibilityFilter: visibilityFilter(state.visibilityFilter, action)
};
}
它做了什么很清楚,但是我不明白为什么它使用state.concat / state.map 来复制状态而不是直接处理它。我知道这是为了实现不变性,但是从技术上讲,如果我从这里更改代码会出现什么问题:
return state.map((todo, index) =>
action.index === index ?
{ text: todo.text, completed: !todo.completed } :
todo
)
到这里:
state[action.index].completed = !state[action.index].completed;
return state;
传递给 reducer 的状态无论如何都是过时的,所以无论它是否已被更改,它都不能在任何地方使用(如果我没记错的话,这确实是 Redux 正在做的事情 - 它忽略了之前的状态并将新的作为“真相的来源”)。所以只有函数返回的新状态才重要。
因此,如果我按照这种方法直接在 reducer 中修改状态并返回它,那会在我的应用程序中创建什么错误?有什么想法吗?
【问题讨论】:
标签: javascript redux immutability flux