1.常用轮子分析

react-live-route -- 重写可以实现我们想要的功能,但成本也比较高,需要注意对原始 <Route> 功能的保存,以及多个 react-router 版本的兼容 185

react-keeper -- 完全替换掉路由方案是一个风险较大的事情,需要较为慎重地考虑 716

react-router-cache-route -- 由于不再是组件卸载,所以和 TransitionGroup 配合得不好,导致转场动画难以实现 492

react-activation -- 其 children 属性抽取出来,渲染到一个不会被卸载的组件内 245

react-keep-alive -- 真实 KeepAlive 功能的实现 438

2.最终选择 react-activation

(1)安装 react-activation 模块

yarn add react-activation

(2)引用

import * as React from "react";
import {
  RouteComponentProps,
  Redirect,
  Switch,
  Route,
  withRouter,
} from "react-router-dom";
import KeepAlive, { AliveScope } from "react-activation";

import Home from "./pages/home";
import HomeChapter from "./pages/home/chapter";

interface IProps extends RouteComponentProps {
  match: any;
}

class HomePage extends React.Component<IProps, {}> {
  render() {
    return (
      <AliveScope>
        <Switch>
          <Redirect
            exact
            from={`${this.props.match.url}`}
            to={`${this.props.match.url}/home`}
          />
          <Route exact path={`${this.props.match.url}/home`} component={Home} />
          <Route
            path={`${this.props.match.url}/home/chapter`}
            // component={HomeChapter}
            render={(props) => (
              <KeepAlive when={true}>
                <HomeChapter {...props} />
              </KeepAlive>
            )}
          />
        </Switch>
      </AliveScope>
    );
  }
}

export default withRouter(HomePage);

.