Статьи

Введение в анимацию в React

В последних двух руководствах по React вы познакомились с основными понятиями React, такими как JSX , маршрутизация и формы . В этом уроке мы перейдем на следующий уровень и попытаемся понять анимацию в React.

Создайте каталог с именем ReactAnimations . Перейдите в каталог и запустите проект с помощью Node Package Manager или npm.

1
2
3
mkdir ReactAnimations
cd ReactAnimations
npm init

Установи react и react-dom на проект.

1
npm install react react-dom —save

Мы будем использовать webpack модуль для этого проекта. Установите webpack и сервер разработки webpack пакетов.

1
npm install webpack webpack-dev-server —save-dev

Установите пакет babel для преобразования синтаксиса JSX в JavaScript в нашем проекте.

1
npm install —save-dev babel-core babel-loader babel-preset-react babel-preset-es2015

Создайте файл конфигурации, необходимый для webpack-dev-server где мы определим входной файл, выходной файл и загрузчик babel. Вот как выглядит webpack.config.js :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
module.exports = {
    entry: ‘./app.js’,
    module: {
        loaders: [
            {
                exclude: /node_modules/,
                loader: ‘babel-loader?presets[]=es2015&presets[]=react’
            }
        ]
    },
    output: {
        filename: ‘bundle.js’
    }
};

Создайте файл index.html котором будет отображаться приложение. Вот как это выглядит:

1
2
3
4
5
6
7
8
9
<html>
    <head>
        <title>TutsPlus — React Animations</title>
    </head>
    <body>
        <div id=»app»></div>
        <script src=»bundle.js»></script>
    </body>
</html>

Создайте файл с именем app.js Внутри app.js импортируйте необходимые библиотеки реагирования, как показано ниже:

1
2
import React from ‘react’;
import {render} from ‘react-dom’;

Создайте компонент без сохранения состояния с именем Home который отображает тег H1 .

1
2
3
4
5
const Home = () => {
    return (
        <h2>{‘TutsPlus — Welcome to React Animations!’}</h2>
    );
};

Визуализируйте компонент Home внутри элемента приложения на странице index.html . Вот как выглядит app.js :

01
02
03
04
05
06
07
08
09
10
11
12
13
import React from ‘react’;
import {render} from ‘react-dom’;
  
const Home = () => {
    return (
        <h2>{‘TutsPlus — Welcome to React Animations’}</h2>
    );
};
  
render(
    <Home />,
    document.getElementById(‘app’)
);

Сохраните вышеуказанные изменения и запустите сервер webpack . Ваше приложение должно работать по адресу http: // localhost: 8080 / index.html .

React предоставляет ряд дополнительных утилит для создания приложений React. TransitionGroup и CSSTransitionGroup — это API для анимации.

Из официальной документации,

ReactTransitionGroup компонент ReactTransitionGroup — это низкоуровневый API для анимации, а ReactCSSTransitionGroup — это дополнительный компонент для простой реализации основных CSS-анимаций и переходов.

Давайте начнем с простой анимации в React. Установите react-addons-css-transition-group к проекту.

1
npm install react-addons-css-transition-group —save

Импортируйте ReactCSSTransitionGroup в файле app.js

1
import ReactCSSTransitionGroup from ‘react-addons-css-transition-group’

Внутри созданного вами компонента Home оберните тег h2 внутри тега ReactCSSTransitionGroup .

1
2
3
4
5
<div>
    <ReactCSSTransitionGroup transitionName=»anim» transitionAppear={true} transitionAppearTimeout={5000} transitionEnter={false} transitionLeave={false}>
        <h2>{‘TutsPlus — Welcome to React Animations’}</h2>
    </ReactCSSTransitionGroup>
</div>

Используя тег ReactCSSTransitionGroup , вы определили часть, где будет происходить анимация. Вы указали имя для перехода с помощью transitionName . Вы также определили, должен ли переход появляться, входить и выходить или нет.

Используя имя перехода, определенное внутри ReactCSSTransitionGroup , вы определите классы CSS, которые будут выполняться при появлении и в активном состоянии. Добавьте следующий стиль CSS на страницу index.html .

1
2
3
4
5
6
7
8
.anim-appear {
  opacity: 0.01;
}
 
.anim-appear.anim-appear-active{
  opacity: 2;
  transition: opacity 5s ease-in;
}

Как вы могли заметить, вам нужно указать продолжительность анимации как в методе рендеринга, так и в CSS. Это потому, что именно так React знает, когда удалять классы анимации из элемента, а когда удалять элемент из DOM.

Сохраните вышеуказанные изменения и обновите страницу. Как только страница загрузится, через несколько секунд вы сможете увидеть анимированный текст.

Чтобы лучше понять анимацию входа и выхода, мы создадим небольшое приложение React. Приложение будет иметь текстовое поле для ввода имени. Вы увидите, как добавить анимацию ввода при добавлении имени в список.

Внутри app.js создайте новый класс с именем App .

1
2
3
class App extends React.Component {
   
}

Инициализируйте список data и переменную name в начальном состоянии компонента.

1
2
3
4
5
6
7
8
9
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: [],
      name:»
    };
  }
}

Внутри части рендеринга компонента App поместите текстовое поле для ввода имени и кнопку, чтобы добавить имя в список массивов.

1
2
3
<div>
    Enter Name <input onChange={this.handleChange} type=»text» /> <input onClick={this.add} type=»button» value=»Add» />
</div>

Определите событие input handleChange событие add внутри компонента App.

1
2
3
handleChange(e){
    this.setState({name:e.target.value})
}

Событие handleChange устанавливает значение входного текстового поля в переменную name . Вот как выглядит метод add:

1
2
3
4
5
add(){
    var arr = this.state.data.slice();
    arr.push({‘id’:(new Date()).getTime(),’name’:this.state.name})
    this.setState({data:arr})
}

Внутри метода add введенное имя и уникальный идентификатор помещаются в список массивов data .

handleChange и add метод в конструктор компонента App.

1
2
3
4
5
6
7
8
9
constructor(props) {
    super(props);
    this.add = this.add.bind(this);
    this.handleChange = this.handleChange.bind(this);
    this.state = {
      data: [],
      name:»
    };
}

Вы будете отображать введенные имена в списке. Измените HTML-код рендеринга, чтобы добавить список.

1
2
3
4
5
6
7
<ul>
{
    this.state.data.map(function(player) {
         return <li key={player.id}>{player.name}</li>
    })
}
</ul>

Чтобы анимировать вновь добавленные элементы, мы добавим тег ReactCSSTransitionGroup поверх элементов li .

1
2
3
4
5
6
7
8
9
<ul>
    <ReactCSSTransitionGroup transitionName=»anim» transitionAppear={false} transitionEnterTimeout={5000} transitionEnter={true} transitionLeave={false}>
    {
      this.state.data.map(function(player) {
         return <li key={player.id}>{player.name}</li>
      })
    }
    </ReactCSSTransitionGroup>
</ul>

Добавьте следующий стиль CSS перехода на страницу index.html .

1
2
3
4
5
6
7
8
.anim-enter {
  opacity: 0.01;
}
 
.anim-enter.anim-enter-active {
  opacity: 2;
  transition: opacity 5s ease-in;
}

Вот полный компонент приложения:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class App extends React.Component {
  constructor(props) {
    super(props);
    this.add = this.add.bind(this);
    this.handleChange = this.handleChange.bind(this);
    this.state = {
      data: [],
      name:»
    };
  }
  add(){
    var arr = this.state.data.slice();
    arr.push({‘id’:(new Date()).getTime(),’name’:this.state.name})
    this.setState({data:arr})
  }
  handleChange(e){
    this.setState({name:e.target.value})
  }
  render() {
    return (
      <div>
        Enter Name <input onChange={this.handleChange} type=»text» /> <input onClick={this.add} type=»button» value=»Add» />
         
        <ul>
        <ReactCSSTransitionGroup transitionName=»anim» transitionAppear={false} transitionEnterTimeout={3000} transitionEnter={true} transitionLeave={false}>
        {
          this.state.data.map(function(player) {
             return <li key={player.id}>{player.name}</li>
          })
        }
        </ReactCSSTransitionGroup>
        </ul>
         
      </div>
    )
  }
}

Сохраните вышеизложенное и обновите страницу. Введите имя и нажмите кнопку добавления, и элемент должен быть добавлен в список с анимацией.

Аналогично, анимация ухода также может быть реализована в приведенном выше коде. После того, как в приложении будет реализована функция удаления, добавьте в index.html класс leave и leave-active . Установите значение transitionLeave ReactCSSTransitionGroup True в теге ReactCSSTransitionGroup в методе рендеринга, и все будет хорошо.

В этом уроке вы увидели, как начать использовать анимацию в React. Вы создали простое приложение React и увидели, как реализовать анимацию появления и ввода. Для получения более подробной информации об анимации в React, я бы рекомендовал прочитать официальную документацию .

Исходный код этого руководства доступен на GitHub .

За последние пару лет популярность React возросла. Фактически, у нас есть ряд товаров на рынке, которые доступны для покупки, просмотра, реализации и так далее. Если вы ищете дополнительные ресурсы по React, не стесняйтесь проверить их .

Дайте нам знать ваши мысли в комментариях ниже. Загляните на мою страницу инструктора Envato Tuts +, чтобы узнать больше о React и связанных с ним веб-технологиях.