首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Redux 实现时间旅行(4)

使用 Redux 实现时间旅行(4)

更高级的缩减程序在   中,您了解了如何组合使用缩减程序与 Redux combineReducers() 函数。图书搜索应用程序的最终版本组合了 4        个缩减程序,如清单 9 所示。
清单 9. 组合后的缩减程序 (reducers.js)        
1
2
3
4
5
6
7
8
// Combine reducers

export default combineReducers({
    books:         fetchReducer,
    topic:         topicReducer,
    currentStatus: statusReducer,
    displayMode:   bookDisplayReducer
});




清单 10 给出了在包含时间旅行功能后,图书搜索应用程序的经过改良的缩减程序。
清单 10. 更高级的 undo          缩减程序        (reducers.js)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { combineReducers } from 'redux';
import { store } from './store';
import stateHistory from './statehistory';

...

const undo = reducer => (state = stateHistory.present, action) => {
  switch(action.type) {
    case 'UNDO':
      stateHistory.undo();
      break;

    case 'REDO':
      stateHistory.redo();
      break;

    case 'GOTO':
      stateHistory.gotoState(action.stateIndex);
      break;

    default:
      const newState = reducer(state, action);
      stateHistory.push(newState);
  }

  return stateHistory.present;
}

// Combine reducers

export default undo(combineReducers({
    books:         fetchReducer,
    topic:         topicReducer,
    currentStatus: statusReducer,
    displayMode:   bookDisplayReducer
}));




在清单 10 中,undo() 函数是一个接受另一个缩减程序作为参数的缩减程序。当前操作与历史无关时,即操作类型不是          UNDO、REDO 或 GOTO 时,undo          函数会使用该缩减程序计算下一个状态。在这种情况下,在包含的缩减程序计算出该状态后,undo 函数会该状态推送到历史堆栈上。
当操作与历史相关时,undo 函数被委托给合适的状态历史方法。无论当前操作是否与历史相关,undo() 函数都会返回          stateHistory 对象当前定义的现在状态。
使用另一个缩减程序来确定下一个状态的缩减程序(比如 undo 函数)被称为高级 缩减程序,您可将它们视为   的等效函数。
返回列表