使用React Router v4和react-transition-group v2动态页面滑动动画

2023-12-23

之前问过一个问题,如何实现页面滑动动画:使用React Router v4和react-transition-group v2进行页面滑动动画 https://stackoverflow.com/questions/45932263/page-sliding-animation-with-react-router-v4-and-react-transition-group-v2.

之后,我遇到了更困难的问题。

function getPathDepth(location) {
  let pathArr = (location || {}).pathname.split('/');
  pathArr = pathArr.filter(n => n !== '');
  return pathArr.length;
}

class Routers extends React.Component {
  constructor(props, context) {
    super(props, context);
    this.state = {
      prevDepth: getPathDepth(props.location)
    };
  }

  componentWillReceiveProps() {
    this.setState({ prevDepth: getPathDepth(this.props.location) });
  }

  render() {
    return (
      <Route render={({ location }) => {
        return (
          <TransitionGroup>
            <CSSTransition
              key={location.key}
              timeout={500}
              classNames={ getPathDepth(location) - this.state.prevDepth > 0 ? 'pageSliderLeft' : 'pageSliderRight' }
              classNames={classNames}
              mountOnEnter={true}
              unmountOnExit={true}
            >
              <Switch location={location}>
                <Route path="/" exact component={ Index } />
                <Route path="/comments" component={ Comments } />
                <Route path="/opinions" component={ Opinions } />
                <Route path="/games/lol" component={ LOL } />
                <Route path="/games/dota" component={ DotA } />
                <Route path="/games" component={ Games } />
              </Switch>
            </CSSTransition>
          </TransitionGroup>
        );
      }} />
    )
  }
}

const WrapRouters = withRouter(Routers);

export default function RouterMap() {
  return (
    <BrowserRouter>
      <WrapRouters />
    </BrowserRouter>
  );
}

CSS:

.pageSliderRight-enter {
  transform: translate3d(-100%, 0, 0);
}

.pageSliderRight-enter.pageSliderRight-enter-active {
  transform: translate3d(0, 0, 0);
  transition: all 600ms;
}
.pageSliderRight-exit {
  transform: translate3d(0, 0, 0);
}

.pageSliderRight-exit.pageSliderRight-exit-active {
  transform: translate3d(-100%, 0, 0);
  transition: all 600ms;
}

.pageSliderLeft-enter {
  transform: translate3d(100%, 0, 0);
}

.pageSliderLeft-enter.pageSliderLeft-enter-active {
  transform: translate3d(0, 0, 0);
  transition: all 600ms;
}
.pageSliderLeft-exit {
  transform: translate3d(0, 0, 0);
}

.pageSliderLeft-exit.pageSliderLeft-exit-active {
  transform: translate3d(100%, 0, 0);
  transition: all 600ms;
}

动画:

如果只是从“/”滑动到“/games”,然后从“/games”滑动回“/”,一切都很好。但随着路线增多,事情就变得复杂了。

当从“/”到“/games”时,游戏的退出动画已指定,不可更改。但显然,它应该是动态的。

  • '/' --> '/games' && '/games' --> '/', 退出动画should是“向右滑动”
  • '/' --> '/games' && '/games' --> '/games/lol', 退出动画should是“向左滑动”

更一般地,当获得更深的路线时,滑动动画应该是“向左滑动”。否则,动画应该是“向右滑动”。

如何动态设置动画?


因此,正如我在评论中已经提到的那样,进一步看,我认为问题在于现有元素的状态已过时。为了解决这个问题,我认为您必须使用子工厂并在退出之前使用新的道具克隆该元素。

或者,可以通过仅执行进入动画并忽略退出动画来稍微简化动画(并且它在移动设备上也应该具有更好的性能)。把它想象成一叠卡片。

像这样的东西: CSS:

.pageSlider-exit  > .page{
    z-index:1;
}
.pageSlider-enter > .page{
    z-index:10;
}
.pageSlider-enter.left > .page{
    transform: translate3d(100%, 0, 0);
}

.pageSlider-enter.right  > .page{
    transform: translate3d(-100%, 0, 0);
}

.pageSlider-enter.pageSlider-enter-active  > .page{
    transform: translate3d(0, 0, 0);
    transition: all 600ms;
}

完整示例:https://codepen.io/anon/pen/yoGqxQ https://codepen.io/anon/pen/yoGqxQ

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用React Router v4和react-transition-group v2动态页面滑动动画 的相关文章

随机推荐

  • Keycloak:从内部 docker 容器运行时令牌颁发者无效

    我在配置 keycloak 在我们的服务器上运行时遇到一些问题 在本地它工作得很好 但在我们的测试环境中 登录后 在使用收到的访问令牌的任何调用中 我们得到 无效的令牌颁发者 预期 http keycloak 8080 auth realm
  • makefile 中的 $(eval ) 导致配方在第一个目标错误之前开始

    CFormat define Format File echo Formatting ifneq wildcard 1 echo if1 The default extensions for intermediate files are n
  • import 语句中的解构赋值

    根据这个source https ponyfoo com articles es6 destructuring in depth以及在某个项目中看到过这种用法的模糊记忆 我很好奇是否有人能够执行以下操作 import map series
  • 如何阻止 WordPress 中的可视化编辑器更改代码?

    每次我切换到 WordPress 中的可视化编辑器时 它都会更改我的代码 例如删除 br 我该如何阻止这个 您不能在基础框架中不添加一些插件 但是 如果您想在可视化编辑器端进行简单的中断 请使用 Shift Enter
  • 如何使用 IE10 播放 HTML5 视频

    我希望有人知道如何帮助我在本地 Intranet 上播放 HTML5 视频 我的 Web 服务器 Windows Server 2008 R2 标准 64 位 IIS版本 IIS7 测试用户环境 Windows 7 Enterprise 使
  • 将内联与显式成员约束相结合时出现奇怪的错误

    更新 我添加了一个重现示例 代码如下所示 type Lib static member inline tryMe a a let name a static member name string name type Test struct
  • 使用 @tffunction 的 Tensorflow2 警告

    此示例代码来自 Tensorflow 2 writer tf summary create file writer tmp mylogs tf function tf function def my func step with write
  • 如何禁用对JSP页面的GET请求?

    我正在修复一些旧缺陷 作为一个缺陷的一部分 我需要确保某些请求仅 POST 到 JSP 页面 而不是 GET 请求 该应用程序有一个表单 可以将数据提交到另一个 JSP 页面 我知道它是错误的并且反对 MVC 但修复它已经太晚了 因为它是一
  • 在 R 中使用 igraph 绘制图形:边长与重量成正比

    我需要为加权无向图绘制一个简单的图 其中唯一的边位于单个中心节点和其他一些节点 即星形网络拓扑 之间 所以我只需要我的节点等距 即之间的角度相同 每对连续的节点 围绕中心节点 但是 我的边缘已加权 我希望边缘长度与权重值成比例 有什么方法可
  • Intellij IDEA构建的war文件位于哪里?

    我正在使用 IntelliJ IDEA 每次运行时都会构建和部署 Web 应用程序项目 所有这一切都在 IntelliJ IDEA 中神奇地发生 但是 现在我应该将其手动部署到测试服务器的 wildfly 上 因此我需要一个工件文件 WAR
  • 如何使用 CUDA Thrust 执行策略覆盖 Thrust 的低级设备内存分配器

    我想重写低级CUDA设备内存分配器 实现为thrust system cuda detail malloc 以便它在调用时使用自定义分配器而不是直接调用cudaMalloc 主机 CPU 线程 这可能吗 如果可以的话 是否可以使用Thrus
  • 无法加载 ,因为它不在 Appbase 下

    我创建了一个NUnit http en wikipedia org wiki NUnit项目 Nunit LoginTest nunit 通过在中选择我的测试项目nunit bin目录 现在我尝试加载该项目 但它给了我以下错误 无法加载 由
  • Inno Setup:如何启动 Adob​​e Reader 并显示 PDF

    我尝试在安装结束时启动 Adob e Reader 以显示自述文件 我使用 PDF 因为我需要显示一些图像 我的 inno 安装脚本失败 并显示 无法执行文件 创建进程失败 代码 267 目录名称无效 我已经尝试过使用和不使用 Filena
  • 请解释一下这个Java正则表达式

    我没有编写以下正则表达式 我正在尝试弄清楚它的作用 我知道它必须从政策地图开始 并且政策地图和接下来的内容之间必须至少有一个空格 但我一直在试图弄清楚括号内的内容意味着什么 我知道无论是什么 它都必须在最后 policy map s x21
  • Chromedriver、Selenium - 自动下载

    我正在使用 Selenium 2 43 0 和 Python 2 7 5 在某一时刻 测试单击一个按钮 将表单信息发送到服务器 如果请求成功 服务器会返回 1 成功的消息 2 合并了表单信息的PDF 我不在乎测试 PDF 我的测试只是寻找成
  • linux ami nginx site_enabled 丢失[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们正在尝试在 Amazon Linux AMI 上安装 nginx 来配置 uwsgi 和 django 但与 Ubuntu 不同 et
  • 在 PHP 中运行具有实时输出的进程

    我正在尝试在网页上运行一个进程 该进程将实时返回其输出 例如 如果我运行 ping 进程 它应该在每次返回新行时更新我的 页面 现在 当我使用 exec command output 时 我被迫使用 c 选项并等到进程完成才能看到输出在我的
  • Google Chrome 插件中出现“onLaunched”错误

    我正在关注 google chrome web 应用程序开发http developer chrome com trunk apps first app html http developer chrome com trunk apps f
  • ec2 实例上的 Nginx 不提供静态文件

    什么在起作用 我已在 AWS EC2 实例上启动并运行 MERN stack 仪表板 EC2 实例位于EC2 aws com React 应用程序在端口上提供服务5004 节点应用程序正在端口上运行5003 改变了什么 当我在 GoDadd
  • 使用React Router v4和react-transition-group v2动态页面滑动动画

    之前问过一个问题 如何实现页面滑动动画 使用React Router v4和react transition group v2进行页面滑动动画 https stackoverflow com questions 45932263 page