国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目次
サスペンスクイックスタート
いくつかの畫(huà)像をプリロードしましょう!
達(dá)成
トランジションステータスの更新
インターネットの滝は避けてください
遅延ハング
デモ
その他
ホームページ ウェブフロントエンド CSSチュートリアル React Suspenseを使用した事前キャッシュ畫(huà)像

React Suspenseを使用した事前キャッシュ畫(huà)像

Apr 02, 2025 pm 06:14 PM

React Suspenseを使用した事前キャッシュ畫(huà)像

Reactのサスペンス機(jī)能はエキサイティングであり、それが來(lái)ており、開(kāi)発者は「準(zhǔn)備ができている」までコンポーネントのレンダリングを簡(jiǎn)単に遅らせることができ、よりスムーズなユーザーエクスペリエンスになります。 「準(zhǔn)備」はここで多くの側(cè)面を指すことができます。たとえば、データロードユーティリティをサスペンスと組み合わせて使用??して、クエリごとに負(fù)荷ステータスを手動(dòng)で追跡せずにデータが転送されている間に、一貫した負(fù)荷ステータスを表示できます。次に、データが利用可能で、コンポーネントが「準(zhǔn)備ができている」とレンダリングされます。これは、サスペンスで最も頻繁に議論されるトピックであり、私は以前にそれについて書(shū)いたことがあります。ただし、データの読み込みは、サスペンスがユーザーエクスペリエンスを改善できる多くのユースケースの1つにすぎません。今日話したい別のユースケースは、畫(huà)像のプリロードです。

畫(huà)像がダウンロードされ、畫(huà)面に到達(dá)したときにレンダリングされたときにポジションが不安やジャンプするWebアプリを作成または使用したことがありますか?私たちはそれをコンテンツの再配置と呼び、それは衝撃的で不快なものです。サスペンスはこの問(wèn)題を解決するのに役立ちます。サスペンスの全體的なポイントは、コンポーネントのレンダリングが準(zhǔn)備が整うことを防ぐことだと言ったことをご存知ですか?幸いなことに、「Ready」はここで非常に開(kāi)かれています - 私たちの目的のために、「必要なプリロードされた畫(huà)像」を含めることができます。それをする方法を見(jiàn)てみましょう!

サスペンスクイックスタート

詳細(xì)を掘り下げる前に、サスペンスがどのように機(jī)能するかをすぐに理解しましょう。 2つの主要な部分があります。まず、コンポーネントハングの概念があります。これは、Reactがコンポーネントをレンダリングしようとしていることを意味しますが、「準(zhǔn)備ができている」わけではありません。これが起こると、コンポーネントツリーで最も近い「フォールバック」がレンダリングされます。すぐにフォールバックを作成する方法(これはかなり単純です)を確認(rèn)しますが、コンポーネントは、まだ準(zhǔn)備ができていないことをReactに伝えています。 Reactは約束をキャプチャし、コンポーネントがまだ準(zhǔn)備ができていないことを認(rèn)識(shí)し、フォールバックをレンダリングします。約束の場(chǎng)合、Reactは再びレンダリングを試みます。このプロセスを繰り返します。はい、私は少し単純化されていますが、それがサスペンスがどのように機(jī)能するかという點(diǎn)であり、私たちはこれらの概念のいくつかを拡張します。

サスペンスの2番目の部分は、「トランジション」ステータスアップデートの導(dǎo)入です。これは、狀態(tài)を設(shè)定することを意味しますが、Reactに狀態(tài)の変化がコンポーネントを掛ける原因となる可能性があり、これが発生した場(chǎng)合、フォールバックはレンダリングされないことを伝えます。代わりに、ステータスの更新が準(zhǔn)備されるまで現(xiàn)在の畫(huà)面を表示し続け、その時(shí)點(diǎn)でレンダリングします。もちろん、Reactは、インライン負(fù)荷フィードバックを提供できるように、このプロセスが進(jìn)行中であることを開(kāi)発者に知らせる「保留中の」ブールインジケーターを提供します。

いくつかの畫(huà)像をプリロードしましょう!

まず、この記事の最後に作成している完全なデモがあることを指摘したいと思います。コードにジャンプしたい場(chǎng)合は、今すぐデモを開(kāi)いてください。遷移狀態(tài)の更新と組み合わせてサスペンスがどのように使用されるかを示し、畫(huà)像をプリロードします。この投稿の殘りの部分では、コードを段階的に構(gòu)築し、途中で方法と理由を説明します。

わかりました、始めましょう!

すべての畫(huà)像がプリロードされるまで、コンポーネントを掛けたいと考えています。操作を可能な限り簡(jiǎn)素化するには、<suspenseimage></suspenseimage> SRC屬性を受信するコンポーネントは、畫(huà)像をプリロードし、例外スローを処理してから、 <img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/174358885649082.png" class="lazy" alt="React Suspenseを使用した事前キャッシュ畫(huà)像"> HTMLで畫(huà)像を使用しますが、JavaScriptのImage()オブジェクトを使用して命令的な方法で畫(huà)像を作成することもできます。さらに、この方法で作成する畫(huà)像には、畫(huà)像がロードされたときに発火するonloadコールバックがあります。このように見(jiàn)えます:

 const img = new Image();
img.onload =()=> {
  //畫(huà)像が読み込まれます};

しかし、どのようにしてそれを例外スローと組み合わせるのでしょうか?あなたが私のようであれば、あなたは最初にこのようなことを考えるかもしれません:

 const suspenseimg =({src、... rest})=> {
  新しい約束を投げる((解決)=> {
    const img = new Image();
    img.onload =()=> {
      解決する();
    };
    img.src = src;
  });
  戻る<img alt="" src="%7Bsrc%7D">;
};

もちろん、問(wèn)題は、これが常に約束を投げかけることです。 Reactがレンダリングを試みるたびに<suspenseimg></suspenseimg>インスタンスが進(jìn)行中の場(chǎng)合、新しい約束が作成され、すぐにスローされます。代わりに、畫(huà)像がロードされる前に約束を投げたいだけです。間接的な層を追加することでコンピューターサイエンスのすべての問(wèn)題を解決できるという古いことわざがあります(間接の層が多すぎるという問(wèn)題を除く)。 SRCを読むと、キャッシュが畫(huà)像をロードしたかどうかを確認(rèn)します。そうでない場(chǎng)合は、プリロードを開(kāi)始して例外をスローします。そして、畫(huà)像がプリロードされている場(chǎng)合、それは単にtrueを返し、Reactが畫(huà)像をレンダリングし続けます。

これは私たちのものです<suspenseimage></suspenseimage>コンポーネントがどのように見(jiàn)えるか:

 const suspenseimg =({src、... rest})=> {
  imgcache.read(src);
  返品<img  src="%7Bsrc%7D" alt="React Suspenseを使用した事前キャッシュ畫(huà)像" >;
};

これが、私たちがキャッシュした最小バージョンのように見(jiàn)えるものです:

 const imgcache = {
  __cache:{}、
  read(src){
    if(!this .__キャッシュ[src]){
      この.__キャッシュ[src] = new Promise((Resolve)=> {
        const img = new Image();
        img.onload =()=> {
          この.__キャッシュ[src] = true;
          Resolve(this .__キャッシュ[src]);
        };
        img.src = src;
      });
    }
    if(this .__キャッシュ[src] instanceof promise){
      これを投げます。__キャッシュ[src];
    }
    これを返してください。__キャッシュ[src];
  }
};

完璧ではありませんが、今のところ十分です。使い続けましょう。

達(dá)成

以下は完全に機(jī)能するデモへのリンクを覚えておいてください。そのため、特定のステップで速すぎて移動(dòng)しても絶望しないでください。私たちは行くように説明します。

フォールバックを定義することから始めましょう。コンポーネントツリーにサスペンスタグを配置してフォールバックを定義し、フォールバック屬性を渡します。保留中のコンポーネントは、最新のサスペンスタグを検索してフォールバックをレンダリングします(ただし、サスペンスタグが見(jiàn)つからない場(chǎng)合、エラーがスローされます)。実際のアプリケーションでは、プロセス全體に多くのサスペンスタグがある場(chǎng)合があり、個(gè)々のモジュールの特定のフォールバックを定義しますが、このデモではルートアプリケーションをラップするタグのみが必要です。

 function app(){
  戻る (
    <suspense fallback="{<Loading"></suspense> }>
      <showimages></showimages>
    
  );
}

<loading></loading>コンポーネントは基本的なスピナーですが、実際のアプリケーションでは、よりシームレスなエクスペリエンスを提供するために実際にレンダリングしようとしているコンポーネントのある種の空のシェルをレンダリングしたい場(chǎng)合があります。

これで、私たちのもの<showimages></showimages>コンポーネントは、最終的に次のものを使用して畫(huà)像をレンダリングします。

<div>
  {images.map((img)=>(
    <div key="{img}">
      <suspenseimg alt="" src="%7Bimg%7D"></suspenseimg>
    </div>
  ))}
</div>

最初の読み込みでは、最初の畫(huà)像が準(zhǔn)備が整うまで荷重スピナーが表示され、その時(shí)點(diǎn)では、インターレース再配置ラグなしで同時(shí)に表示されます。

トランジションステータスの更新

畫(huà)像が配置されたら、次の畫(huà)像のバッチをロードすると、ロード後に畫(huà)像を表示してもらいたい場(chǎng)合は、もちろん、既存の畫(huà)像をロードするときに畫(huà)面上に保持します。これを行うためにuseTransitionフックを使用します。これにより、 startTransition関數(shù)と、ステータスの更新が進(jìn)行中であるが停止されていることを示すisPending Booleanが返されます(または、停止されていない場(chǎng)合でも、ステータスの更新に時(shí)間がかかりすぎると真実かもしれません)。最後に、 useTransition場(chǎng)合、 timeoutMs値を渡す必要があります。これは最大時(shí)間です。これは、 isPendingフラグが真である可能性があります。その後、Reactはフォールバックを放棄してレンダリングします( timeoutMsパラメーターが近い將來(lái)削除される可能性があり、既存のコンテンツが更新されると、遷移狀態(tài)の更新は可能な限り待機(jī)する必要があります)。

これが私がどのように見(jiàn)えるかです:

 const [starttransition、ispending] = usetransition({timeoutms:10000});

Fallbackディスプレイの前に10秒を許可します。これは実際の生活では長(zhǎng)すぎるかもしれませんが、特に実験のためにDevtoolsのネットワークを意図的に減速させる可能性がある場(chǎng)合は、このデモに適しています。

これがそれを使用する方法です。より多くの畫(huà)像をロードするボタンをクリックすると、コードは次のようになります。

 starttransition(()=> {
  setPage((p)=> p 1);
});

このステータスの更新により、GraphQLクライアントMicro-GraphQL-Reactを使用して新しいデータロードがトリガーされます。これは、サスペンスと互換性があり、クエリが進(jìn)行中のときに私たちに約束を投げかけます。データが返されると、畫(huà)像がプリロードされたときにコンポーネントがレンダリングと再度ハングを試みます。これはすべて発生しますが、私たちのisPending値は真実になります。これにより、既存のコンテンツの上部にロードスピナーを表示できます。

インターネットの滝は避けてください

イメージのプリロードが進(jìn)行中に、どのように反応がレンダリングをブロックできるか疑問(wèn)に思うかもしれません。上記のコードを使用して、これを行うとき:

 {images.map((img)=>(

...そしてその中にレンダリングされているもの<suspenseimage></suspenseimage>、反応は最初の畫(huà)像をレンダリングし、ハングしてからリストを再試行し、最初の畫(huà)像(現(xiàn)在はキャッシュに)を超えてから、2番目の畫(huà)像、次に3番目、4番目などを掛けます。前にサスペンスについて読んだ場(chǎng)合は、これらすべてのレンダリングが起こる前にリスト內(nèi)のすべての畫(huà)像を手動(dòng)でプリロードする必要があるかどうか疑問(wèn)に思うかもしれません。

Reactがサスペンスの世界で物事をどのようにレンダリングするかについてはかなり賢いので、心配したり、厄介なプリロードをする必要はないことがわかります。 Reactがコンポーネントツリーを通過(guò)すると、保留中に遭遇しても停止しません。代わりに、コンポーネントツリー內(nèi)の他のすべてのパスをレンダリングしようとし続けています。したがって、はい、畫(huà)像0をレンダリングしようとすると、ハングが発生しますが、Reactはハングする前に畫(huà)像1をnにレンダリングしようとし続けます。

これは、新しい畫(huà)像セットがロードされたときに完全なデモでネットワークタブを表示することで表示できます。ネットワークリストにすぐに畫(huà)像バケットが表示され、1つずつ解析され、完了した場(chǎng)合、結(jié)果を畫(huà)面に表示する必要があります。この効果を?qū)g際に増幅するには、ネットワークの速度を「高速3G」に減らすことをお?jiǎng)幛幛筏蓼埂?/p>

楽しみのために、Reactがコンポーネントをレンダリングしようとする前に、キャッシュから各畫(huà)像を手動(dòng)で読み取り、コンポーネントツリー內(nèi)のすべてのパスを橫斷することにより、サスペンスに畫(huà)像を通過(guò)させることができます。

 Images.foreach((img)=> imgcache.read(img));

これを説明するデモを作成しました。新しい畫(huà)像セットをロードするときにネットワークタブを表示すると、ネットワークリストに順?lè)俗芳婴丹欷皮い毪长趣铯辘蓼梗à郡坤贰ⅴ庭氓去铹`クを遅くしてこれを?qū)g行しないでください)。

遅延ハング

サスペンスを使用する場(chǎng)合、1つの推論を覚えておく必要があります。レンダリングで可能な限り遅れてコンポーネントツリーの低レベルを掛けます。一時(shí)停止された畫(huà)像の束をレンダリングしている場(chǎng)合<imagelist></imagelist>、各畫(huà)像が獨(dú)自のコンポーネントに吊り下げられていることを確認(rèn)して、Reactが個(gè)別にアクセスできるように、他の畫(huà)像をブロックして滝をブロックしないようにします。

このルールのデータ読み込みバージョンは、実際にそれを必要とするコンポーネントによってデータを可能な限りロードする必要があるということです。これは、コンポーネントで以下を?qū)g行することを避ける必要があることを意味します。

 const {data1} = usesuspensequery(query1、vars1);
const {data2} = usesuspensequery(query2、vars2);

これを避けたい理由は、クエリがハングしてから2つを照會(huì)し、滝を引き起こすためです。これがまったく回避できない場(chǎng)合は、吊り下げる前に両方のクエリを手動(dòng)でプリロードする必要があります。

デモ

これが私のコミットメントのデモンストレーションです。上記のデモと同じです。

デモを開(kāi)き、実行して開(kāi)発ツールを開(kāi)くと、DevToolsネットワークタブに表示されているDisable Cacheボックスをチェックしてください。そうしないと、デモ全體が破損します。

コードは、私が以前に示したコードとほぼ同じです。デモの1つの改善は、キャッシュ読み取り方法に次の行があることです。

 setimeout(()=> Resolve({})、7000);

すべての畫(huà)像を適切にプリロードしますが、実際の生活では、1つまたは2つの畫(huà)像がゆっくりとロードされるという理由だけで、無(wú)期限にレンダリングをブロックしたくない場(chǎng)合があります。したがって、たとえ畫(huà)像の準(zhǔn)備ができていなくても、しばらくすると緑色の光を與えます。ユーザーは畫(huà)像または2つの點(diǎn)滅が表示されますが、これはソフトウェアフリーズのフラストレーションに耐えるよりも優(yōu)れています。また、7秒が長(zhǎng)すぎる可能性があることを指摘したいと思いますが、このデモでは、ユーザーがDevToolsのネットワークを遅くして、サスペンス機(jī)能をより明確にし、できればこれをサポートする可能性があると思います。

デモには、Precache畫(huà)像チェックボックスもあります。デフォルトで選択されますが、通常の使用にしてチェックすることができます<img alt="React Suspenseを使用した事前キャッシュ畫(huà)像" >タグの交換<suspenseimage></suspenseimage>コンポーネント、サスペンスバージョンを「通常の反応」と比較する場(chǎng)合(結(jié)果が表示されたら確認(rèn)しないでください。そうしないと、UI全體がハングしてフォールバックをレンダリングする場(chǎng)合があります)。

最後に、CodeSandboxと同様に、一部の狀態(tài)が同期しない場(chǎng)合がある場(chǎng)合があるため、物事が奇妙に見(jiàn)えたり破損したりする場(chǎng)合は、更新ボタンをクリックします。

その他

このデモをまとめるとき、私は誤って大きな間違いを犯しました。ブラウザがダウンロードした畫(huà)像をキャッシュするため、デモがその効果を失いたくありません。したがって、キャッシュブレーカーを使用してすべてのURLを手動(dòng)で変更します。

 const [cacheBuster、setCacheBuster] = ueseState(initial_time);

const {data} = usesuspensequery(get_images_query、{page});
const images = data.allbooks.books.map(
  (b)=> b.smallimage `?cachebust = $ {cachebuster}`
);

Initial_timeは、モジュールレベル(つまり、グローバル)で定義されます。

 const initial_time = new date();

なぜ私がこれをしなかったのか疑問(wèn)に思っているなら:

 const [cachebuster、setCacheBuster] = ueseState(new date());

...これは、ひどくひどい結(jié)果をもたらす可能性があるためです。最初のレンダリングでは、畫(huà)像はレンダリングを試みます。キャッシュはハングを引き起こし、反応するレンダリングをキャンセルし、フォールバックを表示します。すべての約束が解析されたとき、Reactは再目的レンダリングを試みます、そして、私たちの最初のuesestateコールは再実行されます

 const [cachebuster、setCacheBuster] = ueseState(new date());

...新しい初期値で再実行され、まったく新しい畫(huà)像URLがセットになります。コンポーネントが実行されることはなく、CodeSandboxデモは実行を停止します(これにより、デバッグがイライラします)。

これは、この特定のデモの獨(dú)自の要件によって引き起こされる奇妙な特別な問(wèn)題のようですが、より大きな教訓(xùn)があります。レンダリングは純粋であり、副作用はないはずです。 Reactはコンポーネントを複數(shù)回再レンダリングしようとすることができるはずであり、(同じ初期小道具が與えられた)は、反対側(cè)から同じ狀態(tài)を取得する必要があります。

以上がReact Suspenseを使用した事前キャッシュ畫(huà)像の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫(xiě)真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類(lèi)リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

「レンダリングブロッキングCSS」とは何ですか? 「レンダリングブロッキングCSS」とは何ですか? Jun 24, 2025 am 12:42 AM

ブラウザは、特にインポートされたスタイルシート、ヘッダーのインラインCSS、および最適化されていないメディアクエリスタイルを使用して、ブラウザがインラインおよび外部CSSをデフォルトで主要なリソースとして表示するため、ページレンダリングをブロックします。 1.重要なCSSを抽出し、HTMLに埋め込みます。 2。JavaScriptを介して非クリティカルなCSSの読み込みを遅らせる。 3.メディア屬性を使用して、印刷スタイルなどのロードを最適化します。 4.リクエストを減らすためにCSSを圧縮およびマージします。ツールを使用してキーCSSを抽出し、REL = "Preload"非同期負(fù)荷を組み合わせ、過(guò)度の分割と複雑なスクリプト制御を避けるためにメディア遅延荷重を合理的に使用することをお?jiǎng)幛幛筏蓼埂?/p>

外部対內(nèi)部CSS:最良のアプローチは何ですか? 外部対內(nèi)部CSS:最良のアプローチは何ですか? Jun 20, 2025 am 12:45 AM

TheBestAppRoachforCSDependsonTheProject'sSpecificNeeds.forLargerProjects、externalCssissisbetterduetoMaintainasiladability; forsmallerProjectsOrsingLe-PageApplications、internalcsSmightBemoresuitable.it

私のCSSは小文字でなければなりませんか? 私のCSSは小文字でなければなりませんか? Jun 19, 2025 am 12:29 AM

いいえ、CSSDOESNOTHAVETOBEINLOWERCASE。

CSSケース感度:重要なことを理解する CSSケース感度:重要なことを理解する Jun 20, 2025 am 12:09 AM

cssismostlycase-inssensitive、buturlsandfontfamilynamesarecase-sensitive.1)propertiesandvalueslikecolor:red; areotcase-sensitive.2)urlsmustmatchtheserver'scase、例えば、/畫(huà)像/logo.png.3)

Autoprefixerとは何ですか?それはどのように機(jī)能しますか? Autoprefixerとは何ですか?それはどのように機(jī)能しますか? Jul 02, 2025 am 01:15 AM

Autoprefixerは、ターゲットブラウザスコープに基づいてCSS屬性にベンダープレフィックスを自動(dòng)的に追加するツールです。 1.エラーで接頭辭を手動(dòng)で維持する問(wèn)題を解決します。 2. PostCSSプラグインフォーム、CSSを解析し、プレフィックスする必要がある屬性を分析し、構(gòu)成に従ってコードを生成する屬性を分析します。 3.使用手順には、プラグインのインストール、ブラウザーリストの設(shè)定、ビルドプロセスでそれらを有効にすることが含まれます。 4。メモには、接頭辭を手動(dòng)で追加しない、構(gòu)成の更新を保持すること、すべての屬性ではなくプレフィックスを維持することが含まれ、プリ??プロセッサでそれらを使用することをお?jiǎng)幛幛筏蓼埂?/p>

CSSカウンターとは何ですか? CSSカウンターとは何ですか? Jun 19, 2025 am 12:34 AM

csScountersCantAnationally-bersectionSandLists.1)usecounter-resettoinitialize、counter-incrementtoincrease、andcounter()orcounters()todisplayvalues.2)を組み合わせたjavascriptfordynamiccontenttoensureaCurateupdatesと組み合わせます。

CSS:ケースはいつ重要ですか(いつそうではありませんか)? CSS:ケースはいつ重要ですか(いつそうではありませんか)? Jun 19, 2025 am 12:27 AM

CSSでは、セレクターと屬性名はケースに敏感ですが、値、名前の色、URL、およびカスタム屬性はケースに敏感です。 1.バックグラウンドカラーや背景色など、セレクターと屬性名はケース非感受性です。 2。値の16進(jìn)數(shù)色は大文字と小文字を區(qū)別しますが、赤と赤などの名前の色は無(wú)効です。 3. URLは癥例に敏感であり、ファイルロードの問(wèn)題を引き起こす可能性があります。 4.カスタムプロパティ(変數(shù))はケースに敏感であり、使用する場(chǎng)合はケースの一貫性に注意を払う必要があります。

conic-gradient()関數(shù)とは何ですか? conic-gradient()関數(shù)とは何ですか? Jul 01, 2025 am 01:16 AM

TheConic-Gradient()functionsscreateScular勾配の勾配は、測(cè)定されていることを確認(rèn)してください

See all articles