mlynでReactの再レンダリングを減らします。

問題:コンポーネントが状態を更新するアプリケーションがあり、アプリのまったく異なる部分に表示される必要があります。最も簡単な解決策は、コンポーネント階層を介して値を「プロップドリル」することです。

次のアプリを想定します。

コンポーネントは4つだけです。

  • アプリ:アプリケーションコンテナ(状態を宣言します)
  • A:スライダー
  • B:スライダーの値がレンダリングされるdiv
  • C:Bのコンテナ

import React, { useState } from "react";
const A = React.memo(({ progress, setProgress }) => {
  return (
    <input
      type="range"
      value={progress}
      onChange={(e) => {setProgress(e.target.value);}}
    />
  );
});
const B = React.memo(({ progress }) => {
  console.log(">>> render B");
  return <div>{progress}</div>;
});
const C = React.memo(({ progress }) => {
  console.log(">>> render C:", progress);
  return (
    <div style={{ padding: 10, backgroundColor: "yellow" }}>
      <B progress={progress} />
    </div>
  );
});
export const App = React.memo(() => {
  const [progress, setProgress] = useState(0);
  console.log(">>> render App");
  return (
    <div>
      <A progress={progress} setProgress={setProgress} />
      <C progress={progress} setProgress={setProgress} />
    </div>
  );
});

Bのスライドの表示値を更新する場合、これはすべての更新で発生します。

Mlynは、サブジェクトと呼ばれるプロキシ値を導入することでこの問題を解決します。あなたはそれらの主題(またはそれらの一部)をあなたの子供に渡し、必要な場合にのみ購読/更新することができます。上記のコードの移行を手順ごとに確認してみましょう。

export const App = () => {
  const progress$ = useSubject(0);
  console.log(">>> render App");
  return (
    <div>
      <A progress$={progress$} />
      <C progress$={progress$} />
    </div>
  );
};

const A = ({ progress$ }) => {
  const progress = useSubjectValue(progress$);
  return (
    <input
      type="range"
      value={progress}
      onChange={(e) => {
        progress$(e.target.value);
      }}
    />
  );
};

progress$件名の値は、アプリの他のコンポーネントを介して渡すことができます。ただし、サブジェクトをサブスクライブしたコンポーネントのみが再レンダリングされます。

const B = ({ progress$ }) => {
  console.log(">>> render B");
  const progress = useSubjectValue(progress$);
  return <div>{progress}</div>;
};
const C = ({ progress$ }) => {
  console.log(">>> render C");
  return (
    <div style={{ padding: 10, backgroundColor: "yellow" }}>
      <B progress$={progress$} />
    </div>
  );
};

提案された投稿

脳卒中の壊滅的な結果を避ける: 家族の旅から学ぶ 。

脳卒中の壊滅的な結果を避ける: 家族の旅から学ぶ 。

はじめに 脳卒中は、いつでも誰でも起こり得る医療上の緊急事態です。これは、脳の一部への血流が中断され、脳機能が突然失われることで発生します。

私が最もよく使用するコーディング リソース

私が最もよく使用するコーディング リソース

今週、毎日のメールリストのメンバーからメールを受け取りました。彼らは次のことを知りたかったのです。毎日、毎週、毎月どのリソースにアクセスしていますか? 素晴らしい質問です!私のワークフローと使用している主なリソースについての洞察を共有したいと思います。

関連記事

キリスト教徒の迫害: 私たちが語らないヘイトクライム

イスラム嫌悪のことは忘れてください。宗教的憎悪犯罪の主な犠牲者はキリスト教徒(そしてユダヤ人)です。

キリスト教徒の迫害: 私たちが語らないヘイトクライム

理性的な人なら誰でも、政界とメディア界が左派、さらには極左によって支配されており、政治的言説に不均衡を生み出している状況を知っています。宗教の分野では、この不均衡は明らかです。左翼の新聞やネットワークは急いでキリスト教の信仰を擁護していません。

パスワードはもう不要 — パスキーがパスワードをどのように置き換えるか

パスワードはもう不要 — パスキーがパスワードをどのように置き換えるか

曖昧さを避けるために、次の用語が使用されます。認証者; ログイン Web サイトの作成に使用されている携帯電話。ユーザーがログイン要求サービスを行うために使用している Web サイトまたはアプリケーション。特定のサービスを提供するベンダー。例:

安全な労働環境の構築

安全な労働環境の構築

「私が危険にさらされたとき、彼は私を守ってくれます。彼は私をテントの中に隠すでしょう。

ジャーナル・アウトバート

ジャーナル・アウトバート

日記を開く: 1 日 1 枚の写真。私はいつも物語に魅了されてきました。