本文介绍react相关的过渡动画效果的实现

有点类似vue的transition组件,主要用于组件mount和unmount之前切换时应用动画效果

  1. 安装

    cnpm install react-transition-group --save
  2. transition动画

    import React from 'react'
    import ReactDOM from 'react-dom'
    import Transition from 'react-transition-group/Transition';
    const duration = 300;
    const defaultStyle = {
    transition: `opacity ${duration}ms ease-in-out`,
    opacity: 0,
    width: "100px",
    height: "100px",
    background: "red"
    }
    const transitionStyles = {
    entering: { opacity: 0 },
    entered: { opacity: 1 },
    };
    class MyComponent extends React.Component {
    constructor() {
    super();
    this.state = {
    in: false
    }
    }
    toggleEnterState = () => {
    this.setState({in: !this.state.in})
    }
    render() {
    return (
    <div>
    <Transition in={this.state.in} timeout={1000} mountOnEnter={true} unmountOnExit={true}>
    {(state) => (
    <div style={{
    ...defaultStyle,
    ...transitionStyles[state]
    }}>
    I'm A fade Transition!
    </div>
    )}
    </Transition>
    <button onClick={this.toggleEnterState}>Click to Enter</button>
    </div>
    )
    }
    }
    ReactDOM.render(
    <MyComponent/>,
    document.getElementById('root')
    )
  3. transition动画配套api

    ** children
    指的是Transition标签包含的待应用动画的元素,可以使用react的元素,也可以直接用函数,函数可以接受state参数
    state的代表动画的4个状态
    entering
    entered
    exiting
    exited
    ** in
    应用于Transition标签上面,切换enter和exit,从而出现动画效果,布尔值
    ** mountOnEnter
    在元素enter的时候才挂载,布尔值
    ** unmountOnExit
    在元素exit的时候销毁,布尔值
    ** appear
    默认情况下Transition初次挂载的时候不应用动画
    设置为apear之后,会自动应用一次enter动画
    布尔值
    ** enter
    是否启用enter时候的动画,布尔值
    作用和设置timeout为0一样
    ** exit
    是否启用exit时候的动画,布尔值
    作用和设置timeout为0一样
    ** timeout
    过渡的持续时间,必须设置此值,除非addEventListener提供了
    timeout = {500}或者
    timeout = {{
    enter: 300,
    exit: 500
    }}
    ** addEndListener
    用来监听dom节点的transition结束事件
    addEndListener = {
    (node,done) => {
    node.addEventListener('transitionend', function(){
    alert(111);
    });
    done();
    }
    }
    node是dom元素节点,done是切换状态的回调函数
    ** onEnter
    用来监听 enter 状态的钩子函数
    onEnter={
    (node,isAppearing) => {console.log(node,isAppearing)
    }
    node是dom节点
    isAppearing是appear属性值
    另外 onEntering 和 onEntered用法类似
    ** onExit
    用来监听 exit 状态开始触发的钩子函数
    onExit={
    (node) => {console.log(node)
    }
    另外 onExiting 和 onExited 用法类似
  4. animate动画

    ** index.js
    import React from 'react'
    import ReactDOM from 'react-dom'
    import { CSSTransition } from 'react-transition-group';
    import './index.css';
    const defaultStyle = {
    width: "100px",
    height: "100px",
    background: "red"
    }
    class MyComponent extends React.Component {
    constructor() {
    super();
    this.state = {
    in: true
    }
    }
    toggleEnterState = () => {
    this.setState({in: !this.state.in})
    }
    render() {
    return (
    <div>
    <CSSTransition in={this.state.in} timeout={500} classNames='bounceInLeft'>
    {(state) => (
    <div style={{
    ...defaultStyle
    }}>
    I'm A fade Transition!
    </div>
    )}
    </CSSTransition>
    <button onClick={this.toggleEnterState}>Click to Enter</button>
    </div>
    )
    }
    }
    ReactDOM.render(
    <MyComponent/>,
    document.getElementById('root')
    )
    ** index.css
    @keyframes bounceInLeft {
    from, 60%, 75%, 90%, to {
    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
    }
    0% {
    opacity: 0;
    transform: translate3d(-3000px, 0, 0);
    }
    60% {
    opacity: 1;
    transform: translate3d(25px, 0, 0);
    }
    75% {
    transform: translate3d(-10px, 0, 0);
    }
    90% {
    transform: translate3d(5px, 0, 0);
    }
    to {
    transform: none;
    }
    }
    @keyframes bounceOutRight {
    20% {
    opacity: 1;
    transform: translate3d(-20px, 0, 0);
    }
    to {
    opacity: 0;
    transform: translate3d(2000px, 0, 0);
    }
    }
    .bounceInLeft-enter{
    animation: bounceInLeft 1s 1;
    }
    .bounceInLeft-exit{
    animation: bounceOutRight 1s 1;
    }
  5. animate动画配套api

    ** classNames
    用在CSSTransition标签上面,自动添加状态后缀名
    classNames = "demo";
    会依次应用 demo-enter,demo-enter-active,demo-exit,demo-exit-active,demo-appear,demo-appear-active
    如果单独制定class的name的话可以使用如下
    classNames = {{
    appear: 'demo1',
    appearActive: 'demo2',
    enter: 'demo3',
    enterActive: 'demo4',
    exit: 'demo5',
    exitActive: 'demo6'
    }}
    ** onEnter
    在enter或者appear类应用完成后立马调用回调函数
    onEnter={
    (node,isAppearing) => {console.log(node,isAppearing)}
    }
    ** onEntering
    在enter-active或者appear-active应用完成后立马调用回调函数
    onEntering={
    (node,isAppearing) => {console.log(node,isAppearing)}
    }
    ** onEntered
    在enter或者appear移除完成后立马调用回调函数
    onEntered={
    (node,isAppearing) => {console.log(node,isAppearing)}
    }
    ** onExit
    在exit类应用完成后立即调用回调函数
    onEntered={
    (node) => {console.log(node)}
    }
    ** onExiting
    在exit-active类应用完成后立即调用回调函数
    onExiting={
    (node) => {console.log(node)}
    }
    ** onExited
    在exit类移除后立即调用
    onExited={
    (node) => {console.log(node)}
    }
  6. TransitionGroup

    专门处理列表动画而诞生的组件,只要在TransitionGroup中的元素减少或者增加,自动为Transition或者CSSTransition应用in属性
    import React from 'react'
    import ReactDOM from 'react-dom'
    import Transition from 'react-transition-group/Transition';
    import {TransitionGroup} from 'react-transition-group'
    const duration = 300;
    const defaultStyle = {
    transition: `opacity ${duration}ms ease-in-out`,
    opacity: 0,
    width: "100px",
    height: "100px",
    background: "red"
    }
    const transitionStyles = {
    entering: { opacity: 0 },
    entered: { opacity: 1 },
    };
    class MyComponent extends React.Component {
    constructor() {
    super();
    this.state = {
    arr: ['a','c','d','e']
    }
    }
    addItem = () => {
    this.setState({
    arr: this.state.arr.concat(['f'])
    });
    }
    render() {
    return (
    <div>
    <TransitionGroup component="span" appear>
    {this.state.arr.map( (item,index) => (
    <Transition key={index} timeout={0}>
    {(state) => (
    <div style={{
    ...defaultStyle,
    ...transitionStyles[state]
    }}>
    {item}
    </div>
    )}
    </Transition>
    ) )}
    </TransitionGroup>
    <button onClick={this.addItem}>添加元素</button>
    </div>
    )
    }
    }
    ReactDOM.render(
    <MyComponent/>,
    document.getElementById('root')
    )
  7. TransitionGroup配套api

    ** component
    默认TransitionGroup是渲染成div,可以通过指定component改变这一默认行为
    ** appear
    是否执行初次渲染enter动画
    ** enter
    是否开启enter动画
    ** exit
    是否开启exit动画
    ** childFactory
    此函数是TransitionGroup将要展示子元素的拦截器
    childFactory={(el) => {console.log(el);return el}}

react过渡动画效果的实现,react-transition-group的更多相关文章

  1. 067——VUE中vue-router之使用transition设置酷炫的路由组件过渡动画效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. vue过渡动画效果

    1 过渡基础 1.1 过渡的方式 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果. 包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CSS ...

  3. React实现动画效果

    流畅.有意义的动画对于移动应用用户体验来说是非常必要的.和React Native的其他部分一样,动画API也还在积极开发中,不过我们已经可以联合使用两个互补的系统:用于全局的布局动画LayoutAn ...

  4. 63、具有过渡动画效果的布局Layout

    下面,下来看一个Demo的效果,代码如下: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android ...

  5. 64、具有过渡动画效果的布局Layout( 2 )

    [ CoordinatorLayout-与手势完美结合的滑动视图 ] [ AppBarLayout-可以随手势滑动的AppBar ] <android.support.design.widget ...

  6. react中使用css动画效果

    index.js import React, { Component, Fragment } from 'react'; class App extends Component { construct ...

  7. CSS中的变形、过渡、动画效果

    一.变形 .过渡效果 1:元素平移 x方向 y方向 transform:translate(100px 100px); 2:过渡动画效果 a:什么属性参与过渡效果 b:过渡时间 c:过渡的效果 值包含 ...

  8. css动画效果之transition(动画过渡效果属性)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Vue.js 第3章 axios&Vue过渡动画

    promise 它将我们从回调地狱中解脱出来 创建和使用 var fs = require('fs') // 创建promise // reslove表示执行成功后调用的回调函数 // reject表 ...

随机推荐

  1. 【bzoj3238】差异[AHOI2013](后缀数组+单调栈)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3238 这道题从大概半年以前就开始啃了,不过当时因为一些细节没调出来,看了Sakits神犇 ...

  2. JAVA 写中文字符串到指定文件 中文乱码 问题解决

    之前试过下面代码里面的注释掉的 方法,都不行,后来想到了不如指定编码格式试试,果真可以了. String as= “中文字符”; //byte[] b = as.getBytes(); try{ Fi ...

  3. Nginad Server安装

    前言 Nginad是一个基于php的开源项目,它既可以作为静态配置的Ad Server,也可以作为动态的RTB Exchange使用.代码结构比较直接明了,挺适合用作学习的.本文如果有理解错误的地方, ...

  4. 搭建confluence参考文献

    https://www.cnblogs.com/kevingrace/p/7607442.html https://yq.aliyun.com/articles/144747?t=t1 jira: h ...

  5. django学习笔记整理(2)django的路由系统

    创建一个属于你的django框架.django-admin startproject 框架名 打开你的django框架,你会发现里面还有一个和框架名同名的文件夹,那个文件夹就称为一个app. 创建了d ...

  6. Node.js核心模块_全局变量、util学习

    全局对象 javascript的全局对象是window,他及其所有属性都可以在程序的任何地方访问.即全局变量. 而在node中全局对象是global,所有全局变量都是global对象的属性,包括其本身 ...

  7. css3——transition属性和opacity属性

    [transition-duration] 是一个css3属性,规定完成过度效果需要花费的时间(一秒或毫秒计).语法:transition-duration: time;time :    规定完成过 ...

  8. uva 10917 最短路+dp

    https://vjudge.net/problem/UVA-10917 给出N点M边的无向图,没重边.对于点A,B,当且仅当从B到终点的最短路小于任何一条从A到终点的最短路时,才考虑从A走到B,否则 ...

  9. 1D/1D优化dp之利用决策点的凸性优化

    关于dp的优化之前做过一些简单的利用优先队列或者单调队列维护一个值就ok了,但有时候给出的方程很难直接用单调队列维护,需要转化一下思路. 这种优化方式利用数形结合,根据比较斜率来抛去一些非最优解,能将 ...

  10. android问题 This version of android studio is incompatible with the gradle version used.

    http://blog.csdn.net/sinat_15417921/article/details/51907728 问题背景 因为项目app分包需要,将工程的graddle版本升至了2.2.0 ...