当前位置: 首页 > news >正文

React Transition Group -- Transition 组件

导语

新的一年,换了新的工作也算是新的开始吧,最近对页面的切换动画比较感兴趣,所以就以React Transition Group库为切入口做一些深入的理解吧。

安装

# npm
npm install react-transition-group --save

# yarn
yarn add react-transition-group

官方提供三个组件,分别为 Transition, CSSTransition, TransitonGroup。
这一章主要介绍下 Transition 组件。

Transition

Transition 组件允许您使用简单的声明性API描述从一个组件状态到另一个组件状态的转换。最常见的是,它用于动画组件的安装和卸载,但也可以用于描述就地的过渡状态。

默认情况下,转换组件不改变它呈现的组件的行为,它只跟踪组件的“进入”和“退出”状态。由你来赋予这些状态意义和效果。例如,我们可以在组件进入或退出时向其添加样式。

如前所述,转换组件本身不会对其子组件执行任何操作。它所做的是随时间跟踪转换状态,以便在组件更改状态时更新组件(例如通过添加样式或类)。

在一个过渡中有四种主要状态:

  • entering
  • entered
  • exiting
  • exited

过渡状态通过in属性切换。当为true时,组件开始“Enter”阶段。在此阶段中,组件将从当前转换状态转移到转换期间的“进入”状态,然后在完成转换后再转移到“进入”状态。

看完了基本介绍,下面来一个最基本的例子:

首先,创建我们的 Fade 组件

第一步:定义属性

const duration = 300;

const defaultStyle = {
  transition: `opacity ${duration}ms ease-in-out`,
  opacity: 0,
}

const transitionStyles = {
    entering: { opacity: 0 },
    entered:  { opacity: 1 },
}

第二步:定义组件

const Fade = (props) => (
    <Transition in={props.inProp} timeout={duration}>
        {(state) => (
            <div style={{
                ...defaultStyle,
                ...transitionStyles[state]
            }}>
                {props.children}
            </div>
        )}
    </Transition>
)

Transition 组件的 in 属性是一个 boolean 值,由子组件传入,用于控制子组件的状态,是否显示。
我们的 Fade 组件创建好了,接下来就该试试好不好用了,我们创建一个新的组件,定义一些简单的样式,定义一个内部状态show,传入Fade 组件,然后使用 Fade 组件包裹它。

export default class App extends Component {

    state = {
        show: true
    }

    render () {
        const circle = {
            margin: 2,
            width: 100,
            height: 100,
            position: 'absolute',
            display: 'inline-block',
            left: 100,
            boxShadow: '0px 1px 2px #999',
            textShadow: '0px 1px 2px #999',
            lineHeight: '100px',
            textAlign: 'center',
            color: 'white',
            fontSize: 10,
        }
        return (
            <Fade inProp={this.state.show}>
                <div style={circle} onClick={()=>this.setState(state=>({show: !state.show}))}>
                    Show
                </div>
            </Fade>
        )
    }
}

效果图:

图片描述

Props

我们来看看 Trasition 组件的其它常用属性。

children

可以使用一个函数来代替 React 元素,通过调用这个函数与当前过渡状态(‘enter’、‘enter’、‘exit’、‘exited’、‘unmount’),可用于将特定于上下文的props应用于组件。

type: Function | element
required

in

用于显示组件;触发进入或退出状态

type: boolean
default: false

mountOnEnter

默认情况下,子组件与父转换组件一起立即挂载。如果你想“延迟挂载”第一个in={true}上的组件,你可以设置mountOnEnter。在第一次进入转换之后,组件将保持挂载状态,即使在“退出”状态下也是如此,除非你还指定unmountOnExit。

type: boolean
default: false

unmountOnExit

默认情况下,子组件在达到“退出”状态后仍然挂载。如果你希望在组件退出后卸载组件,请设置unmountOnExit。

type: boolean
default: false

appear

通常,如果组件挂载时显示组件,则该组件不进行转换。如果您希望在第一个挂载集上进行转换,则显示为true,并且组件将在< transition >挂载后立即进行转换。
注意:没有特定的“显示”状态。appear只添加一个额外的enter转换。

type: boolean
default: false

enter

启用或禁用enter转换。

type: boolean
default: true

exit

启用或禁用exit转换。

type: boolean
default: true

timeout

转换的持续时间,单位为毫秒。

timeout={{
 enter: 300,
 exit: 500,
}}

type: number | { enter?: number, exit?: number }

addEndListener

添加自定义转换结束触发器。使用正在转换的DOM节点和done回调调用。允许更细粒度的转换结束逻辑。注意:如果提供超时,仍将其用作回退。

addEndListener={(node, done) => {
  // use the css transitionend event to mark the finish of a transition
  node.addEventListener('transitionend', done, false);
}}

type: Function

onEnter

在应用“输入”状态之前触发的回调。提供了一个额外的参数isAppearing,以指示是否在初始挂载上出现了enter阶段。

type: Function(node: HtmlElement, isAppearing: bool) -> void
default: function noop() {}

onEntering

在应用“输入”状态之前触发的回调。提供了一个额外的参数isAppearing,以指示是否在初始挂载上出现了entering阶段。

type: Function(node: HtmlElement, isAppearing: bool) -> void
default: function noop() {}

onEntered

在应用“输入”状态之前触发的回调。提供了一个额外的参数isAppearing,以指示是否在初始挂载上出现了entered阶段。

type: Function(node: HtmlElement, isAppearing: bool) -> void
default: function noop() {}

onExit

在应用“退出”状态之前触发的回调。

type: Function(node: HtmlElement) -> void
default: function noop() {}

onExiting

在应用“退出”状态之后触发的回调。

type: Function(node: HtmlElement) -> void
default: function noop() {}

onExited

应用“退出”状态后触发的回调。

type: Function(node: HtmlElement) -> void
default: function noop() {}

相关文章:

  • 开源项目之ASP.NET Core + Vue.js 的前后端分离的通用后台管理系统框架
  • 客户端链接Blog
  • [IOI2018] werewolf 狼人
  • Docker学习笔记_安装和使用Python
  • JS正则表达式详解
  • ActiveMQ (一):安装启动及测试
  • 利用消息队列处理分布式事务
  • 番外篇1:在Windows环境下安装JDK
  • qwq
  • LeetCode18.四数之和 JavaScript
  • matlab-高数 diff 方向导数
  • 聊一聊前端的监控
  • android图片蒙层
  • Docker学习笔记_使用Dockerfile创建flask的一个镜像
  • java 多线程基础, 我觉得还是有必要看看的
  • python3.6+scrapy+mysql 爬虫实战
  • 【笔记】你不知道的JS读书笔记——Promise
  • 30秒的PHP代码片段(1)数组 - Array
  • Android 架构优化~MVP 架构改造
  • co.js - 让异步代码同步化
  • codis proxy处理流程
  • JavaScript HTML DOM
  • Java超时控制的实现
  • Nacos系列:Nacos的Java SDK使用
  • PHP 7 修改了什么呢 -- 2
  • Python_OOP
  • SAP云平台里Global Account和Sub Account的关系
  • Shell编程
  • webpack项目中使用grunt监听文件变动自动打包编译
  • windows下使用nginx调试简介
  • 大数据与云计算学习:数据分析(二)
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 工程优化暨babel升级小记
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 马上搞懂 GeoJSON
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 微信公众号开发小记——5.python微信红包
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (0)Nginx 功能特性
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)字符分类函数
  • (day 12)JavaScript学习笔记(数组3)
  • (第一天)包装对象、作用域、创建对象
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (分类)KNN算法- 参数调优
  • (汇总)os模块以及shutil模块对文件的操作
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (原)Matlab的svmtrain和svmclassify
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)关于pipe()的详细解析