ReactJS - アニメーション:コンポーネントを生き生きとする

こんにちは、未来のReactアニメーションの魔術師たち!このエキサイティングなReactJSアニメーションの旅にあなたを案内できることを誇りに思います。コンピュータサイエンスを教えてきた者として、アニメーションはアプリケーションを単なる機能的なものから、非常に楽しいものにする秘伝のソースのようなものだと言えます。それでは、さっそくコンポーネントを踊らせましょう!

ReactJS - Animation

React Transition Groupの魔法

アニメーションを始める前に、React Transition Groupについて理解しましょう。これをツールボックスに例えると、スムーズで目を引くトランジションをReactアプリケーションで作成するのに役立つ素晴らしいガジェットが詰まっています。

React Transition Groupのインストール

まず第一に、React Transition Groupをプロジェクトに招待しましょう。ターミナルを開き、以下のコマンドを入力します:

npm install react-transition-group

または、yarnを使っている場合は:

yarn add react-transition-group

素晴らしい!今あなたはアニメーションのスーパーパワーの手に入れました。

トランジション:アニメーションの基本単位

Transitionコンポーネントは、家の基礎のようなものです。これを基盤にしてアニメーションを構築します。簡単な例で実際に見てみましょう:

import React, { useState } from 'react';
import { Transition } from 'react-transition-group';

const duration = 300;

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

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

const FadeInOut = () => {
const [inProp, setInProp] = useState(false);

return (
<div>
<Transition in={inProp} timeout={duration}>
{state => (
<div style={{
...defaultStyle,
...transitionStyles[state]
}}>
フェードイン・フェードアウトするテキストです!
</div>
)}
</Transition>
<button onClick={() => setInProp(!inProp)}>
クリックしてフェード
</button>
</div>
);
};

これを分解してみましょう:

  1. Transitionreact-transition-groupからインポートします。
  2. 初期状態のdefaultStyleとトランジションの各段階のtransitionStylesを設定します。
  3. FadeInOutコンポーネントは、表示状態を制御するためのinPropという状態を持っています。
  4. Transitionコンポーネントには、表示状態のinとアニメーション時間のtimeoutという主要なプロパティがあります。
  5. Transition内部では、現在のトランジション状態を受け取る関数を使用して、適切なスタイルを適用します。

ボタンをクリックすると、テキストがスムーズにフェードインしてフェードアウトします。魔法のように感じますよね?

CSSTransition:CSSとReactの遭遇

それでは、CSSTransitionでゲームをレベルアップしましょう。これはTransitionの cooler な兄弟で、CSSクラスとシームレスに働きます。楽しい例を見てみましょう:

import React, { useState } from 'react';
import { CSSTransition } from 'react-transition-group';
import './styles.css'; // これをすぐに作成します

const Superhero = () => {
const [inProp, setInProp] = useState(false);

return (
<div>
<CSSTransition in={inProp} timeout={300} classNames="super">
<div className="superhero">
私はスーパーヒーローだ!
</div>
</CSSTransition>
<button onClick={() => setInProp(!inProp)}>
変身!
</button>
</div>
);
};

そして、CSS (styles.css) は以下の通りです:

.superhero {
background-color: #f0f0f0;
padding: 20px;
border-radius: 5px;
}

.super-enter {
opacity: 0;
transform: scale(0.9);
}
.super-enter-active {
opacity: 1;
transform: translateX(0);
transition: opacity 300ms, transform 300ms;
}
.super-exit {
opacity: 1;
}
.super-exit-active {
opacity: 0;
transform: scale(0.9);
transition: opacity 300ms, transform 300ms;
}

以下のようになります:

  1. CSSTransitionを使います。
  2. classNames="super"を指定して、super-entersuper-enter-activeなどのクラスを使います。
  3. CSSで各トランジション段階の見た目を定義します。

「変身!」をクリックすると、スーパーヒーローが壮大に現れて消えます。まるでスーパーヒーロー映画を見ているようなものです!

TransitionGroup:複数のトランジションを管理する

最後に、TransitionGroupについて話しましょう。これはオーケストラの指揮者のように、複数のトランジションを一度に管理します。実用的な例を見てみましょう:

import React, { useState } from 'react';
import { CSSTransition, TransitionGroup } from 'react-transition-group';
import './list-styles.css';

const TodoList = () => {
const [items, setItems] = useState([]);
const [inputValue, setInputValue] = useState('');

const addItem = () => {
setItems([...items, { id: Date.now(), text: inputValue }]);
setInputValue('');
};

const removeItem = (id) => {
setItems(items.filter(item => item.id !== id));
};

return (
<div>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="タスクを入力"
/>
<button onClick={addItem}>追加</button>
<TransitionGroup className="todo-list">
{items.map(({ id, text }) => (
<CSSTransition
key={id}
timeout={500}
classNames="item"
>
<div className="todo-item">
{text}
<button onClick={() => removeItem(id)}>X</button>
</div>
</CSSTransition>
))}
</TransitionGroup>
</div>
);
};

対応するCSS (list-styles.css):

.todo-list {
list-style-type: none;
padding: 0;
}

.todo-item {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 10px;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
}

.item-enter {
opacity: 0;
}
.item-enter-active {
opacity: 1;
transition: opacity 500ms ease-in;
}
.item-exit {
opacity: 1;
}
.item-exit-active {
opacity: 0;
transition: opacity 500ms ease-in;
}

この例では、アイテムが追加されたときにフェードインし、削除されたときにフェードアウトします。以下のようになります:

  1. TransitionGroupでリストをラップします。
  2. 各アイテムをCSSTransitionでラップします。
  3. アイテムが追加または削除されたときに、TransitionGroupがトランジションを自動的に管理します。

結果として、プロジェクトマネージャーも誇りに思えるスムーズでプロフェッショナルなトゥードリストが完成します!

締め括り

そしてここまで、Reactアニメーションの世界を旅しました。基本的なTransitionから強力なTransitionGroupまで。忘れてはならないのは、アニメーションはただ見た目を華やかにするだけではなく、ユーザーをアプリケーションの中で導く直感的なインターフェースを作成するためのものです。

以下に、カバーしたメソッドの簡単な参照表を示します:

コンポーネント 使用用途 主要なプロパティ
Transition 基本的なトランジション in, timeout
CSSTransition CSSベースのトランジション in, timeout, classNames
TransitionGroup 複数のトランジションを管理 component (オプション)

それでは、アニメーションを試みましょう!そして、強力な力は責任と共に来ます。アニメーションを賢く使えば、ユーザーは感謝してくれるでしょう。ハッピーコーディング!

Credits: Image by storyset