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

2024-05-14

我正在使用React Router v4和react-transition-group v2来测试页面滑动动画。

const RouterMap = () => (
  <Router>
    <Route render={({ location }) =>
      <TransitionGroup>
        <CSSTransition key={location.pathname.split('/')[1]} timeout={500} classNames="pageSlider" 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" component={ Games } />
          </Switch>
        </CSSTransition>
      </TransitionGroup>
    } />
  </Router>
)

还有CSS:

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

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

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

动画如下:

正如你所看到的,动画index page滑动到detail page没问题(从右到左)。但是当我点击Back图标,我希望index page从左到右出来。

我知道如果我按如下方式更改 CSS,页面将从左到右出现:

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

但是如何将两个动画结合在一起呢?一般来说,每当用户单击后退图标时,动画应该是from left to right.


更新:2017.08.31

感谢@MatijaG,使用路径深度确实是一个很棒的主意。我跟着它,遇到了一个新问题。

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

<Route render={({ location }) =>
  <TransitionGroup>
    <CSSTransition
      key={location.pathname.split('/')[1]}
      timeout={500}
      classNames={ getPathDepth(location) - this.state.prevDepth > 0 ? 'pageSliderLeft' : 'pageSliderRight' }
      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 } /> // add a new route
        <Route path="/games" component={ Games } />
      </Switch>
    </CSSTransition>
  </TransitionGroup>
} />

并更新了 CSS:

.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;
}

.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;
}

动画:

从'/'到'/games'是可以的,从'/games'回到'/'也是可以的(类型1:路线 A -> 路线 B,只有 2 条路线)。但是如果首先从'/'到'/games',然后从'/games'到'/games/lol',第二阶段会丢失动画(类型2:路线A -> 路线B -> 路线C,3条或更多路线)。我们还看到,从“/games/lol”回到“/games”,再回到“/”,幻灯片动画与类型1不同。

有人对这个问题有任何想法吗?


好吧,主要问题是,即使在您的问题中,您也没有指定应用程序应该如何知道使用哪个方向。

一种方法是使用路径深度/长度:如果您要导航的路径比当前路径“更深”,则从右向左过渡,但如果从左向右过渡较浅?

另一个问题是路由器只提供您要去的位置,因此您可能应该保存以前的位置(或深度),以便可以将其进行比较。

之后只需在 css 类名之间切换即可, 沿着这样的思路:

import React from 'common/react'
import { withRouter, Route, Switch } from 'react-router'

function getPathDepth (location) {
    return (location || {} ).pathname.split('/').length
}
class RouterMap extends React.PureComponent {
    constructor (props, context) {
        super(props, context)
        this.state = {
            prevDepth: getPathDepth(props.location),
        }
    }

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

        return (
            <Router>
                <Route render={ ({ location }) =>
                    (<TransitionGroup>
                        <CSSTransition
                            key={ location.pathname.split('/')[1] }
                            timeout={ 500 }
                            classNames={ getPathDepth(location) - this.state.prevDepth ? 'pageSliderLeft' : 'pageSliderRight' } 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' component={ Games } />
                            </Switch>
                        </CSSTransition>
                    </TransitionGroup>)
                }
                />
            </Router>
        )
    }
}

export default withRouter(RouterMap)

代码笔:https://codepen.io/matijag/pen/ayXpGr?editors=0110 https://codepen.io/matijag/pen/ayXpGr?editors=0110

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

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

  • 在React Router v6中以编程方式重定向到路由时出现问题

    我想对某些用户操作执行导航 例如按钮的 onSubmit 假设用户单击 添加联系人 按钮 我希望反应路由器在主页 中重定向 目前我正面临这个问题 gt TypeError Cannot read properties of undefine
  • Apache 服务器上的 React、js

    我正在一个react js项目中工作 我有一个安装了apache服务器的云服务器 我的问题是我可以在 apache 服务器上设置我的反应项目吗 正如达文 泰伦所说 react是一种浏览器技术 除了客户端浏览器从服务器下载应用程序之外 一切都
  • 如何使用 React Router v6 和测试库测试路由逻辑?

    我按照此从 React Router v5 迁移到 v6tutorial https reactrouter com en main start tutorial 我想测试一下反应测试库 https testing library com
  • 如何导航到新页面 React Router v4

    我正在构建一个加密货币市场应用程序来练习reactjs 当应用程序启动时 具有某些属性的货币列表将显示为列表 我需要导航到不同的页面 新页面 Currency组件 而不加载当前页面底部的组件 目前我能够将其呈现在页面底部 但这不是我需要的
  • 从 HashRouter 中删除 #

    我在用着react router dom对于我的路由 由于我也在使用 GitHub Pages 所以我需要使用HashRouter in my Router jsx like so import React from react impor
  • React Router v4 NavLink 活动路由

    我正在尝试使用 v3 移植我的项目react router到现在所谓的 v4react router dom 现在 当我有一个 MenuBar 组件时 问题就出现了 该组件与路由逻辑完全分开 如您所期望的 因为无论当前路径是什么 它都会显示
  • ReactJs - 是否可以根据组件树的状态设置 url 或查询字符串

    我有一个组件 其中有多个嵌套组件 特别是选项卡 药丸等 任何时候都无法看到所有组件 我希望能够根据 URL 参数 或 URL 设置它们的默认状态 属性 但我不清楚如何在 React 中实现这一点 例如 我有一个带有两个选项卡的组件 引导程序
  • 有没有办法从函数内单击导航链接?

    基本上 我正在延迟导航 单击链接后 onClick 处理程序通过检查条件并调用另一个函数来阻止导航 如果满足特定条件 则仅该页面导航到另一个页面 那么我如何从该函数中触发 Navlink 单击 我能够通过使用解决这个问题event prev
  • 多个 BrowserRouter 显示多个组件

    我想用basename来分离组件 我也有全局 url 所以我最终使用了 3 个BrowserRouters 这会导致显示多个内容 如果我去 fruit search 它会显示以下内容Homepage组件和FruitSearch成分 我究竟如
  • 纯组件在没有变化时渲染?

    我有一个像这样的纯组件 interface Props checkBoxTitleStyle any checkBoxBackgroundColor any onPressCheckBox id isChecked selectedArra
  • 反应超出最大调用堆栈大小

    如果用户未登录 我尝试将用户重定向到 TrapPage 这是我的代码 function requireAuth nextState replace if auth loggedIn replace pathname trap export
  • 一个 Next.js 路由中的两个不同子域

    我想使用构建一个新平台Next js https nextjs org React js https reactjs org and 反应路由器 https reacttraining com react router web guides
  • 如何延迟 NavLink 的反应?

    Delay e gt e preventDefault setTimeout gt e unpreventDefault make this work 500 render
  • 如何将React JS状态保存到本地存储中

    我不知道如何将 React js 状态存储到本地存储中 import React Component from react import App css import auth createUserProfileDocument from
  • React Router LINK不传递参数

    我有一个 React 有声读物搜索应用程序 它按作者姓氏从 Librivox 获取数据并显示书籍列表 列表中的每个项目都有一个链接 该链接依次转到显示的单独的完整图书数据组件 该特定书籍 或用户从列表中选择的任何书籍 的所有数据 在我的一生
  • 查询字符串的 URL 与反应路由器路由不匹配

    鉴于此 React 路由器配置
  • React DOM Router 不会重定向链接

    我正在尝试使用react dom router包在我的 React 应用程序中 但我没有被成功 重定向 到该组件 仅当我刷新页面或通过 URL 访问时它才起作用 这是我的App js import React Component from
  • React Router Navigate 路径

    我想更好地了解 useNavigate 的工作原理 因为我并不真正理解该模式 这是我的路线
  • 如何聚焦反应路由器链接

    我有一个用于搜索的输入框 并且希望能够按向下键将焦点从输入移动到列表的第一个s 看来我这里的东西不起作用 因为不是实际的 DOM 节点 我能够使用它来工作 a 代替 though let Link require react router
  • 刷新或直接点击链接时找不到 React.js 页面

    我在此链接上有一个反应项目 https notchy cross 000webhostapp com https notchy cross 000webhostapp com 如果向下滚动 您会看到一个名为 产品类别 的部分 https i

随机推荐