如何在不在单页应用程序中重新安装组件的情况下更新 React Router 中的路由?

how to update a route in React Router without re-mounting the component in a single page app?

我正在寻找一种方法来 "cosmetically" 更新 React/Redux/React-Router/React-Router-Redux 应用程序地址栏中的路由, 实际上不会导致组件路线改变时重新挂载。

我正在使用 React CSS 过渡组来制作进入路线的动画。所以当用户从

/home/

/home/profile/bob,

动画触发。

但是,在 /home/profile/bob 上,用户可以滑动 left/right 以访问其他配置文件 -- /home/profile/joe

我希望地址栏中的 URL 在发生这种情况时更新,但目前这会导致 profile 组件重新安装,从而重新触发 CSS 转换组,导致动画触发——我只希望动画在从非配置文件路由到配置文件路由时触发,而不是在配置文件路由之间切换时触发。

我希望这是有道理的。我本质上是在寻找一种方法 "cosmetically" 更新应用程序 URL 而无需强制重新安装管理该路由的组件。

如果您使用的是 React 路由器,当您更改 url 时它会 mount/unmount。这是正常行为。页面之间的转换也是一样的,你只能声明和in/out转换而不知道你来自哪个url路径:(

我已经尝试实现您所说的。我可以在 'child-routes' 之间移动时阻止整页转换,但我无法触发子路由的特定转换(由于父路由重新呈现)。这是我想出的 https://codesandbox.io/s/Dkwyg654k.

import React, { Component } from 'react';
import { render } from 'react-dom';
import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';
import { CSSTransitionGroup } from 'react-transition-group';

import About  from './components/About';
import Home   from './components/Home';
import Topics from './components/Topics';

import './styles.css';

var currentRoute = ''

const getParentPathname = pathname => 
  pathname === '/'
    ? ''
    : (/([a-zA-Z])([^/]*)/).exec(pathname)[0]

class BasicExample extends Component {
  render = () =>
    <Router>
      <Route
        render={({ location, history, match }) => {

          const nextRoute = getParentPathname(location.pathname)
          const isParentRouteChange = 
                !currentRoute.includes(nextRoute) || 
                !nextRoute.includes(currentRoute)
          currentRoute = nextRoute

          return(
            <div>
              <ul>
                <li>
                  <Link to="/">Home</Link>
                </li>
                <li>
                  <Link to="/about">About</Link>
                </li>
                <li>
                  <Link to="/topics">Topics</Link>
                </li>
              </ul>

              <hr />
              <CSSTransitionGroup
//                 transitionEnter={isParentRouteChange}
//                 transitionLeave={isParentRouteChange}
                transitionEnterTimeout={500}
                transitionLeaveTimeout={500}
                transitionName={isParentRouteChange ? "fade" : "slide"}
              >
                <Switch key={location.key} location={location}>
                  <Route exact path="/"       component={Home}   location={location} key={location.key}/>
                  <Route       path="/about"  component={About}  location={location} key={location.key}/>
                  <Route       path="/topics" component={Topics} location={location} key={location.key}/>
                </Switch>
              </CSSTransitionGroup>
            </div> 
          )

        }
      }/>
    </Router>

}

render(<BasicExample />, document.body)