UNPKG

react-router

Version:

A complete routing library for React.js

53 lines (43 loc) 1.61 kB
'use strict'; import { getParamNames } from './PatternUtils'; function routeParamsChanged(route, prevState, nextState) { if (!route.path) return false; var paramNames = getParamNames(route.path); return paramNames.some(function (paramName) { return prevState.params[paramName] !== nextState.params[paramName]; }); } /** * Returns an object of { leaveRoutes, enterRoutes } determined by * the change from prevState to nextState. We leave routes if either * 1) they are not in the next state or 2) they are in the next state * but their params have changed (i.e. /users/123 => /users/456). * * leaveRoutes are ordered starting at the leaf route of the tree * we're leaving up to the common parent route. enterRoutes are ordered * from the top of the tree we're entering down to the leaf route. */ function computeChangedRoutes(prevState, nextState) { var prevRoutes = prevState && prevState.routes; var nextRoutes = nextState.routes; var leaveRoutes = undefined, enterRoutes = undefined; if (prevRoutes) { leaveRoutes = prevRoutes.filter(function (route) { return nextRoutes.indexOf(route) === -1 || routeParamsChanged(route, prevState, nextState); }); // onLeave hooks start at the leaf route. leaveRoutes.reverse(); enterRoutes = nextRoutes.filter(function (route) { return prevRoutes.indexOf(route) === -1 || leaveRoutes.indexOf(route) !== -1; }); } else { leaveRoutes = []; enterRoutes = nextRoutes; } return { leaveRoutes: leaveRoutes, enterRoutes: enterRoutes }; } export default computeChangedRoutes;