mirror of
				https://github.com/reduxjs/redux-devtools.git
				synced 2025-11-04 01:47:25 +03:00 
			
		
		
		
	Merge
This commit is contained in:
		
						commit
						1edf2d25c8
					
				| 
						 | 
					@ -91,6 +91,7 @@ function liftReducer(reducer, monitorReducer, initialState) {
 | 
				
			||||||
   * Manages how the DevTools actions modify the DevTools state.
 | 
					   * Manages how the DevTools actions modify the DevTools state.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  return function liftedReducer(liftedState = initialLiftedState, liftedAction) {
 | 
					  return function liftedReducer(liftedState = initialLiftedState, liftedAction) {
 | 
				
			||||||
 | 
					    let shouldRecomputeStates = true;
 | 
				
			||||||
    let {
 | 
					    let {
 | 
				
			||||||
      committedState,
 | 
					      committedState,
 | 
				
			||||||
      stagedActions,
 | 
					      stagedActions,
 | 
				
			||||||
| 
						 | 
					@ -127,6 +128,8 @@ function liftReducer(reducer, monitorReducer, initialState) {
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ActionTypes.JUMP_TO_STATE:
 | 
					    case ActionTypes.JUMP_TO_STATE:
 | 
				
			||||||
      currentStateIndex = liftedAction.index;
 | 
					      currentStateIndex = liftedAction.index;
 | 
				
			||||||
 | 
					      // Optimization: we know the history has not changed.
 | 
				
			||||||
 | 
					      shouldRecomputeStates = false;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ActionTypes.SWEEP:
 | 
					    case ActionTypes.SWEEP:
 | 
				
			||||||
      stagedActions = stagedActions.filter((_, i) => !skippedActions[i]);
 | 
					      stagedActions = stagedActions.filter((_, i) => !skippedActions[i]);
 | 
				
			||||||
| 
						 | 
					@ -138,19 +141,34 @@ function liftReducer(reducer, monitorReducer, initialState) {
 | 
				
			||||||
      if (currentStateIndex === stagedActions.length - 1) {
 | 
					      if (currentStateIndex === stagedActions.length - 1) {
 | 
				
			||||||
        currentStateIndex++;
 | 
					        currentStateIndex++;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      stagedActions = [...stagedActions, liftedAction.action];
 | 
					      stagedActions = [...stagedActions, liftedAction.action];
 | 
				
			||||||
      timestamps = [...timestamps, liftedAction.timestamp];
 | 
					      timestamps = [...timestamps, liftedAction.timestamp];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Optimization: we know that the past has not changed.
 | 
				
			||||||
 | 
					      shouldRecomputeStates = false;
 | 
				
			||||||
 | 
					      // Instead of recomputing the states, append the next one.
 | 
				
			||||||
 | 
					      const previousEntry = computedStates[computedStates.length - 1];
 | 
				
			||||||
 | 
					      const nextEntry = computeNextEntry(
 | 
				
			||||||
 | 
					        reducer,
 | 
				
			||||||
 | 
					        liftedAction.action,
 | 
				
			||||||
 | 
					        previousEntry.state,
 | 
				
			||||||
 | 
					        previousEntry.error
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      computedStates = [...computedStates, nextEntry];
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (shouldRecomputeStates) {
 | 
				
			||||||
      computedStates = recomputeStates(
 | 
					      computedStates = recomputeStates(
 | 
				
			||||||
        reducer,
 | 
					        reducer,
 | 
				
			||||||
        committedState,
 | 
					        committedState,
 | 
				
			||||||
        stagedActions,
 | 
					        stagedActions,
 | 
				
			||||||
        skippedActions
 | 
					        skippedActions
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    monitorState = monitorReducer(monitorState, liftedAction);
 | 
					    monitorState = monitorReducer(monitorState, liftedAction);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -184,4 +184,35 @@ describe('devTools', () => {
 | 
				
			||||||
    storeWithBug.dispatch({ type: 'SET_UNDEFINED' });
 | 
					    storeWithBug.dispatch({ type: 'SET_UNDEFINED' });
 | 
				
			||||||
    expect(storeWithBug.getState()).toBe(2);
 | 
					    expect(storeWithBug.getState()).toBe(2);
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should not recompute states on every action', () => {
 | 
				
			||||||
 | 
					    let reducerCalls = 0;
 | 
				
			||||||
 | 
					    let monitoredStore = devTools()(createStore)(() => reducerCalls++);
 | 
				
			||||||
 | 
					    expect(reducerCalls).toBe(1);
 | 
				
			||||||
 | 
					    monitoredStore.dispatch({ type: 'INCREMENT' });
 | 
				
			||||||
 | 
					    monitoredStore.dispatch({ type: 'INCREMENT' });
 | 
				
			||||||
 | 
					    monitoredStore.dispatch({ type: 'INCREMENT' });
 | 
				
			||||||
 | 
					    expect(reducerCalls).toBe(4);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should not recompute states when jumping to state', () => {
 | 
				
			||||||
 | 
					    let reducerCalls = 0;
 | 
				
			||||||
 | 
					    let monitoredStore = devTools()(createStore)(() => reducerCalls++);
 | 
				
			||||||
 | 
					    let monitoredDevToolsStore = monitoredStore.devToolsStore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(reducerCalls).toBe(1);
 | 
				
			||||||
 | 
					    monitoredStore.dispatch({ type: 'INCREMENT' });
 | 
				
			||||||
 | 
					    monitoredStore.dispatch({ type: 'INCREMENT' });
 | 
				
			||||||
 | 
					    monitoredStore.dispatch({ type: 'INCREMENT' });
 | 
				
			||||||
 | 
					    expect(reducerCalls).toBe(4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    monitoredDevToolsStore.dispatch(ActionCreators.jumpToState(0));
 | 
				
			||||||
 | 
					    expect(reducerCalls).toBe(4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    monitoredDevToolsStore.dispatch(ActionCreators.jumpToState(1));
 | 
				
			||||||
 | 
					    expect(reducerCalls).toBe(4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    monitoredDevToolsStore.dispatch(ActionCreators.jumpToState(3));
 | 
				
			||||||
 | 
					    expect(reducerCalls).toBe(4);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user