ホームページ > ウェブフロントエンド > jsチュートリアル > React でジェネレーターを使用して魔法を実現する

React でジェネレーターを使用して魔法を実現する

Patricia Arquette
リリース: 2024-12-30 06:18:10
オリジナル
463 人が閲覧しました

Use generators for magic in React

はっきり言っておきますが、あなたはフックの過剰摂取です。 ID とキーさえも React アプリの状態として生きています。 useState フックは、状態が変化するたびに仮想 DOM を更新するという副作用を引き起こします。無関係なデータを状態として保存すると、パフォーマンスが低下します。

すべてのケースをジェネレーターで解決できるわけではありません。ただし、複雑なフック パターンをジェネレーターに置き換えてロジックを簡素化し、管理しやすく拡張しやすくすることができます。

TL;DR

ジェネレーターを使用して、React コンポーネントでデータを動的に生成します。ジェネレーターを使用すると、ロジックを簡素化し、フックへの依存を減らすことができます。


ジェネレーターをいつ、どこで使用するかを理解するのに役立つ簡単な例を紹介します。

ジェネレーターとは何ですか?

ジェネレーターは、一時停止したり再開したりできる関数です。これらは、function* 宣言と yield 式を使用して作成されます。

function* generator() {
    yield 1;
    yield 2;
    yield 3;
}

const gen = generator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
ログイン後にコピー
ログイン後にコピー

これらを使用して、データのコレクションを反復処理したり、一連のデータを生成したりできます。これにより、コンポーネント内のコンテンツをレンダリングするために使用できます。

まだ混乱していますか?ジェネレーターの使用法を理解するために、簡単な例を作成してみましょう。

見出しの例

コンポーネントでレンダリングしたい見出しのリストがあるとします。

const headlines = [
    "Local Shops Thrive",
    "Team Wins Finals",
    "Stay Flu-Free",
    "New Phone Launch",
    "Sunny Week Ahead",
];
ログイン後にコピー

これを行うには、ヘッドライン配列を反復処理し、インデックスを状態変数として保存することで、コンポーネント内で各ヘッドラインをレンダリングします。

import { useState } from "react";

const Headlines = () => {
    const [index, setIndex] = useState(0);

    return (
        <div>
            <h1>{headlines[index]}</h1>
            <button onClick={() => setIndex((index + 1) % headlines.length)}>
                Next
            </button>
        </div>
    );
};
ログイン後にコピー

これは、反復処理して繰り返し表示する見出しの線形配列が得られるまではうまく機能します。さて、見出しにパターンを作成したい場合はどうすればよいでしょうか?たとえば、最初に時刻に基づいて挨拶メッセージを表示し、次に曜日を表示し、最後にランダムな動機付けの考えをフォローアップします。

const headlines = [
    "Good Morning", // Greeting message
    "Today is Monday", // Day of the week
    "Stay positive", // Motivational thought
];
ログイン後にコピー

静的データのセットを単純に反復処理することはできません。代わりに、各見出しを動的に計算する必要があります。

しかし、あなたはメガマインドです。あなたはアイデアを思いつきました。パターンの各部分を計算し、その出力をレンダリング テキストとして使用する 3 つの関数を作成してはどうでしょうか?

function getGreetingMessage() {
    const hours = new Date().getHours();
    if (hours < 12) {
        return "Good Morning";
    } else if (hours < 18) {
        return "Good Afternoon";
    } else {
        return "Good Evening";
    }
}

function getDayOfTheWeek() {
    const days = [
        "Sunday",
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
    ];
    return `Today is ${days[new Date().getDay()]}`;
}

function getMotivationalThought() {
    const thoughts = ["Stay positive", "Keep going", "You're awesome"];
    return thoughts[Math.floor(Math.random() * thoughts.length)];
}
ログイン後にコピー

これらの関数を使用して、コンポーネント内で見出しをレンダリングできるようになります。

import { useState } from "react";

const Headlines = () => {
    const pattern = [
        getGreetingMessage,
        getDayOfTheWeek,
        getMotivationalThought,
    ];
    const [index, setIndex] = useState(0);

    return (
        <div>
            <h1>{pattern[index]()}</h1>
            <button onClick={() => setIndex((index + 1) % pattern.length)}>
                Next
            </button>
        </div>
    );
};
ログイン後にコピー

何か気づきましたか?コンポーネントのロジック全体を変更しました。ロジックを簡素化し、コンポーネントをクリーンに保つために、ジェネレーターを使用できます。

function* patternGenerator() {
    yield getGreetingMessage();
    yield getDayOfTheWeek();
    yield getMotivationalThought();
}

const pattern = patternGenerator();
ログイン後にコピー

これで、このジェネレーターを使用してコンポーネント内の見出しをレンダリングできるようになります。

import { useState } from "react";

const Headlines = () => {
const [index, setIndex] = useState(0);

    return (
        <div>
            <h1>{pattern.next().value}</h1>
            <button onClick={() => setIndex((index + 1) % 3}>Next</button>
        </div>
    );

};
ログイン後にコピー

こうすることで、コンポーネントをクリーンに保ち、ロジックをシンプルに保つことができます。ジェネレーターを使用すると、ロジックを簡素化し、フックに休憩を与えることができます。

ジェネレーターは、データの生成方法の背後にあるロジックも抽象化します。さらに、コンポーネント内のロジックを変更せずに、ジェネレーターに関数を追加したり、関数の順序を変更したりすることで、パターンを簡単に拡張できます。

さらに一歩前進するには、ジェネレーター ロジックを処理するカスタム フックを作成することもできます。

function* generator() {
    yield 1;
    yield 2;
    yield 3;
}

const gen = generator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
ログイン後にコピー
ログイン後にコピー

これにより、ジェネレーター内でロジックがどのように変化しても、ジェネレーターの API がコンポーネント間で一貫性を保つことも保証されます。

したがって、データ生成プロセスの柔軟性と制御が向上します。

ジェネレーターを使用する利点:

  1. 一貫した API とデータ生成とレンダリングの間の懸念事項の分離により、コンポーネント ロジックを簡素化します。
  2. オンデマンドのデータ生成を有効にして、状態の使用を最小限に抑え、不要なデータ ストレージを回避します。
  3. データ生成に対するきめ細かい制御と柔軟で拡張可能なアプローチを提供します。

留意事項

  1. ジェネレーターは React 専用ではなく、純粋な JavaScript の機能です。
  2. ジェネレータの一時停止と再開機能により、メモリ効率が向上します。
  3. 副作用を生成したり、不規則な更新や突然変異を引き起こしたりすることはありません。

今、私は幸せな場所にいます!

結論

ジェネレーターは、データ提供のプロセスを合理化し、データ生成コンポーネントとレンダリング コンポーネント間の懸念を分離するのに役立ち、パフォーマンスを損なうことなく、データ生成のより優れた制御と柔軟性を提供します。

JavaScript のジェネレーターに関する Anjana Vakil による素晴らしい講演もご覧ください。

この記事が、ジェネレーターをいつどこで使用するかを理解するのに役立つことを願っています。ご質問やフィードバックがございましたら、お気軽に Twitter までご連絡ください。

元の投稿は ashishk1331 のブログです。

以上がReact でジェネレーターを使用して魔法を実現するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート