React动画--react-trasition-group

349 阅读1分钟

这是我参与更文挑战的第18天,活动详情查看: 更文挑战

Why使用react-trasition-group动画

平常css做动画碰到display: none动画就失效, 比如opcity做淡入淡出效果

安装

npm i react-transition-group --save

1. 在app.js 中导入CSSTransition

import React from 'react';
import Swiper from './components/swiper';
import "./assets/css/app.css";
import  './assets/css/common/animation.css'
import {CSSTransition} from "react-transition-group";

class App extends React.Component{
    constructor(){
        super();
        this.state={
            show: false
        };
    }
    componentDidMount(){

    }
    render(){
        return (
            <div className="App">
                <CSSTransition in={this.state.show} timeout={2000} classNames={"fade"} onEntered={(el)=> {
                    console.log('入场动画回调',el)
                }}
                onExited={(el) => {
                    console.log('入场动画回调',el)
                }}
                >
                    <div className="box"></div>
                </CSSTransition>
                <button onClick={()=>{this.setState({show: !this.state.show})}}>切换盒子状态</button>
            </div>
        )
    }
}

export default App;

2. 写fade 的css样式

/**
进场动画
 */
.fade-enter {
    left: 0;
}

.fade-enter-active {
    left: 300px;
    transition: all 2s;
}

.fade-enter-done {
    left: 300px;
    /*display: none;*/
}

/**
出场动画
 */
.fade-exit {
    left: 300px;
    /*display: block;*/
}

.fade-exit-active {
    left: 0px;
    transition: all 2s;
}

.fade-exit-done {
    left: 0px;
}

3. 效果

2021-06-19-13-11-19.gif

4.TransitionGroup和CSSTransition搭配在列表中的使用

1.react-transition-group的优势 React有非常好的开发环境,任何开发需要的基本需求都可以找到官方或大神造的轮子,动画也不例外。

react-transition-group动画组件表现很好,可以满足日常动画开发需求,而且是React官方提供的动画过渡库,有完整的API文档。

注:

react-transition-group官方文档

reactcommunity.org/react-trans…

app.js

 <div className={'user_list_container'}>
                    <ul>
                        <TransitionGroup>
                            {this.state.userList.map((v,i) => (
                                <CSSTransition timeout={300} key={i} classNames={'user'}>
                                    <li className={'user_list_item'} >
                                        <span className={'username'}>{v.username}</span>
                                        <button className={'del_btn'} onClick={this.delUser.bind(this,i)}>删除</button>
                                    </li>
                                </CSSTransition>
                            ))}
                        </TransitionGroup>
                    </ul>
                    <div className={'add_user'}>
                        <input onInput={(e)=>{this.setState({username: e.target.value})}}/>
                        <button onClick={this.addUser.bind(this)}>添加用户</button>
                    </div>
</div>

animation.css

/**
进场动画
 */
.fade-enter {
    left: 0;
}

.fade-enter-active {
    left: 300px;
    transition: all 2s;
}

.fade-enter-done {
    left: 300px;
    /*display: none;*/
}

/**
出场动画
 */
.fade-exit {
    left: 300px;
    /*display: block;*/
}

.fade-exit-active {
    left: 0px;
    transition: all 2s;
}

.fade-exit-done {
    left: 0px;
}

/**
用户退场
 */
.user-exit {
    opacity: 1;
}

.user-exit-active {
    opacity: 0;
    transition: opacity 300ms;
}

.user-exit-done {
    opacity: 0;
}

/**
用户进场
 */
.user-enter {
    opacity: 0;
}

.user-enter-active {
    opacity: 1;
    transition: opacity 300ms;
}

.user-enter-done {
    opacity: 1;
}

2021-06-19-14-10-31.gif