code: function Redirect({ computedMatch, to, push = false }) {
    return (
      <RouterContext.Consumer>
        {(context) => {
          invariant(context, 'You should not use <Redirect> outside a <Router>');
  
          const { history, staticContext } = context;
  
          const method = push ? history.push : history.replace;
          const location = createLocation(
            computedMatch
              ? typeof to === 'string'
                ? generatePath(to, computedMatch.params)
                : {
                  ...to,
                  pathname: generatePath(to.pathname, computedMatch.params)
                }
              : to
          );
  
          // When rendering in a static context,
          // set the new location immediately.
          if (staticContext) {
            method(location);
            return null;
          }
  
          return (
            <Lifecycle
              onMount={() => {
                method(location);
              }}
              onUpdate={(self, prevProps) => {
                const prevLocation = createLocation(prevProps.to);
                if (
                  !locationsAreEqual(prevLocation, {
                    ...location,
                    key: prevLocation.key
                  })
                ) {
                  method(location);
                }
              }}
              to={to}
            />
          );
        }}
      </RouterContext.Consumer>
    );
  }
docs: The public API for navigating programmatically with a component.