👾 笔记 | react-transition-group 实现路由切换过渡动画

这篇具有很好参考价值的文章主要介绍了👾 笔记 | react-transition-group 实现路由切换过渡动画。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、react-transition-group 使用

相关技术的使用:

  • React 18
  • React router v6

React Transition Group 是一个 React 库,专门用于在 React 应用中管理和处理过渡动画效果。这个库提供了一组组件,包括 Transition、CSSTransition、SwitchTransition 和 TransitionGroup,帮助在组件的进入和退出时应用动画效果。
Transition 是一个与平台无关的组件,通常结合 CSS 完成样式。
CSSTransition 是一个常用的组件,广泛用于添加过渡动画效果。它具有动画的作用时间(timeout)和指定元素首次渲染在页面时是否进行动画(appear)等参数。
SwitchTransition 用于在两个组件显示和隐藏切换时使用。
TransitionGroup 将多个动画组件包裹在其中,一般用于列表中元素的动画。执行中有三个状态:appear,enter,exit,这需要定义对应的 CSS 样式。
React Transition Group 可以应对大量常见简单动画,但如果需要编写高级动画,建议使用其他库如 react-spring、framer-motion 等。

Layout的示例伪代码

import { CSSTransition, SwitchTransition } from 'react-transition-group';
import { useLocation, useNavigate, useOutlet } from 'react-router-dom';

const currentOutlet = useOutlet();
...
<Layout className="site-layout">
  <Content className="site-content">
    <SwitchTransition mode="out-in">
      <CSSTransition
          key={location.pathname}
          appear={true}
          timeout={300}
          classNames="page"
          unmountOnExit
      >
        {currentOutlet}
      </CSSTransition>
    </SwitchTransition>
  </Content>
</Layout>

因为 CSSTransition 的 classNames 为 page:


// 页面切换过渡动画
.page {
  position: absolute;
  left: 15px;
  right: 15px;
}

// 页面切换过渡动画 --- 进入
.page-enter {
  opacity: 0;
  transform: scale(1.1);
}

// 页面切换过渡动画 --- 进入(被激活)
.page-enter-active {
  opacity: 1;
  transform: scale(1);
  transition: opacity 300ms, transform 300ms;
}

// 页面切换过渡动画 --- 离开
.page-exit {
  opacity: 1;
  transform: scale(1);
}

// 页面切换过渡动画 --- 离开(被激活)
.page-exit-active {
  opacity: 0;
  transform: scale(0.9);
  transition: opacity 300ms, transform 300ms;
}

注意事项:

1.网上可以搜到的许多文章里都提到,组件间的切换动画需要使用 TransitionGroup 来包裹。但是在官网最新的介绍里可以看到这段话

  • 第一反应可能是在 TransitionGroup 中包裹所有路由,但这种方法需要 hack 并且在与 React Router 的更棘手的组件(如 Redirect)一起使用时很容易崩溃。 您应该为每个路由使用 CSSTransition 并自行在prop中管理它们。”

2.使用 SwitchTransition 包裹 CSSTransition,这样不会导致页面上同时展示 A 页面和 B 页面的组件,反之使用 TransitionGroup 进行包裹,就会产生两个页面同时存在的情况。
3.最重要的一点: 不要直接使用 Outlet 及<Outlet />,而要使用useOutlet。在我没阅读官网的代码前,我尝试使用 SwitchTransition 和 CSSTransition 对 <Outlet /> 进行包裹,来实现子路由组件的展示。结果:

  • 第一个页面的离开的动画丢失了。
  • 第二个页面会被加载两次,直观反映就是页面闪烁,useEffect(()=>{},[]) 或者 componentDidMount() 被调用两次。
    因为 <Outlet /> 会导致在同一页面的新旧组件各调用一次接口,所以请使用 useOutlet。

二、 <Outlet /> 与 useOutlet 区别

<Outlet />useOutlet都是在React Router中用来实现路由导出的功能,但是它们的使用方式和场景有所不同。

  1. <Outlet />

<Outlet /> 是一个 React 组件,通常在路由配置中使用,用于指定当前路由的子组件应该被渲染到哪个位置。它是一个受控组件,也就是说,它的值(即要渲染的组件)是由父组件(通常是路由组件)控制的。当父组件的状态发生改变时,<Outlet /> 会自动更新渲染的组件。
例如,在路由配置中,你可以使用<Outlet />来指定一个位置,用于渲染当前路由的子路由组件:

<Route path="/user/:userId" component={UserPage}>
  <Outlet />
</Route>

在上面的例子中,当用户访问一个符合 /user/:userId 路径的URL时,UserPage组件会被渲染,并且子路由组件会渲染到 <Outlet /> 指定的位置。

  1. useOutlet

useOutlet 是一个自定义Hook,它允许你在函数组件中使用React Router的功能。通过使用 useOutlet,你可以在组件中获取到当前路由的子路由组件,并将其渲染到指定的位置。与 <Outlet /> 不同的是,useOutlet 是一个非受控组件,它的值是由调用 Hook 的代码控制的。useOutlet 是一个钩子函数,它用于在组件中获取当前嵌套路由的信息。如果嵌套路由没有挂载,则 useOutlet 返回 null;如果嵌套路由已经挂载,则 useOutlet 返回嵌套的路由对象。通过使用 useOutlet,可以在组件中获取嵌套路由的相关信息,例如路径、查询参数等。
下面是使用 useOutlet 的示例:

import { useOutlet } from 'react-router-dom';

function MyComponent() {
  const outlet = useOutlet();
  
  return (
    <div>
      <h1>My Component</h1>
      {outlet}
    </div>
  );
}

在上面的例子中,我们通过使用useOutlet获取到一个outlet对象,然后将这个对象渲染到组件中指定的位置。当路由发生变化时,React Router会自动更新渲染的子路由组件。
总的来说,<Outlet />useOutlet 在 React Router v6 中都用于处理嵌套路由的相关操作。<Outlet /> 更适合在 React Router 的路由配置中使用,用于在应用程序的当前路由中渲染嵌套的 Route 组件。而 useOutlet 则更适合在函数组件内部使用,用于在组件中获取当前嵌套路由的信息。文章来源地址https://www.toymoban.com/news/detail-837829.html

到了这里,关于👾 笔记 | react-transition-group 实现路由切换过渡动画的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web学习笔记-React(路由)

    笔记内容转载自 AcWing 的 Web 应用课讲义,课程链接:AcWing Web 应用课。 本节内容是如何将页面和 URL 一一对应起来。 Web 页面可以分为两大类: 静态页面:页面里的数据是写死的,即整个文件存放在服务器上,当用户访问 URL 时,服务器原封不动地将页面信息传给前端。 动态

    2024年02月09日
    浏览(39)
  • el-select报错:vue.esm.js?5cd5:5105 [Vue warn]: <transition-group> children must be keyed: <ElTag>;无法选中

    目录 一、问题 二、原因及解决方法 三、总结 Tips:嫌麻烦可以直接看总结中有颜色的字体即可! 1. 使用element select控件时有警告(transition-group children must be keyed: ElTag)且无法选中下拉项 vue.esm.js?5cd5:5105 [Vue warn]: transition-group children must be keyed: ElTag found in --- TransitionGroup        

    2024年02月14日
    浏览(46)
  • react实现路由跳转动画

    下载插件 配置路由 app组件中引入并使用 引入动画样式 实现效果

    2024年02月15日
    浏览(41)
  • React/Vue实现路由鉴权/导航守卫/路由拦截

    1、实现思路 自己封装  AuthRoute  路由鉴权高阶组件,实现未登录拦截,并跳转到登录页面 思路为:判断本地是否有token,如果有,就返回子组件,否则就重定向到登录Login 2、实现步骤 在 components 目录中,创建 AuthRoute/index.js 文件 判断是否登录 登录时,直接渲染相应页面组

    2024年02月15日
    浏览(40)
  • 探索React Router:实现动态二级路由

    我有一个路由配置的二维数组,想根据这个数组结合路由组件来动态生成路由,应该怎么样实现。在 React Router 6 中渲染二级路由的方式跟 React Router 65相比有一些变化,但核心思路仍然是利用 Route 组件和路由嵌套的方式。下面是具体的步骤: 定义路由数组 注意,这里我们使用

    2024年04月25日
    浏览(30)
  • react从构建到实现小计算器到路由(基础篇)

    1.创建项目之前 node.js 版本是18.14.2的,之前是10.15.0 [nvm list//查看目前已经安装的版本 nvm list available //显示可下载版本的部分列表 nvm install 10.15.0 //安装指定的版本的nodejs nvm use 10.15.0 //使用指定版本的nodejs] 2.npx create-react-app 项目名称 3.npm run start 4.注释掉src里面的index.js里面的

    2024年02月02日
    浏览(39)
  • react ant-design实现导航菜单menu的路由设置/切换页面

    ant-design版本是5.1.1,路由版本是v6的 新版本的导航菜单路由设置与旧版的不太一样,刚开始的时候甚至不知道该怎么写 实现效果: 代码: 首先,给导航菜单的menu添加点击事件 修改item,通过设置点击事件获取点击后的key值(key值即路由跳转的页面) 打印出来看看 获取到的

    2024年02月12日
    浏览(58)
  • uniapp小程序利用transition实现吸顶效果

     需要利用scroll-view监听页面滚动距离(注意,需要添加:throttle=\\\"false\\\"关闭内置的节流阀) scrollTop监听页面滚动变化 然后利用官网的transition组件实现吸顶效果(选用淡入淡出) (zero-custom-bar、v-tab是第三方插件库,可以去插件市场搜索。Topbar是我自己封装的一个自定义组件,可以

    2024年02月08日
    浏览(47)
  • vue折叠展开transition动画使用keyframes实现

    需求,我正常的菜单功能有隐藏与显示功能,需要增加动画 打开的时候宽度从0到300,关闭的时候,宽度从300到0

    2024年01月25日
    浏览(50)
  • CSS笔记——触发式动画Transition、主动式动画Animation、Transfrom 动画、CSS 3D 动画、阴影和滤镜样式

    一、触发式动画Transition transition过渡动画, 一般配合伪类使用 属性值: transition-duration: 指定过渡效果的持续时间,以秒或毫秒为单位。 transition-timing-function: 指定过渡效果的时间函数,即控制过渡速度的函数。常用的值有 ease、linear、ease-in、ease-out、ease-in-out 等。 transi

    2024年02月07日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包