目次
Component と PureComponent には 1 つの違いがあります
Component和PureComponent有一个不同点
浅比较101
从不改变
存在性能问题?
不要在render的函数中绑定值
不要在render方法里派生数据
浅い比較 101
決して変更しない
パフォーマンスの問題はありますか?
その他の解決策" >その他の解決策
render メソッドでデータを導出しないでください
ホームページ ウェブフロントエンド jsチュートリアル ComponentとPureComponentの違いを詳しく解説

ComponentとPureComponentの違いを詳しく解説

May 24, 2018 pm 03:44 PM
component 詳しい説明

今回は、Component と PureComponent の使用の違いについて詳しく説明します。Component と PureComponent を使用する際の 注意事項 は何ですか? 以下は実際のケースです。

私は PureCompoent の使用に切り替え始めました。これは、Component のよりパフォーマンスの高いバージョンであるためです。これは事実であることが判明しましたが、このパフォーマンスの向上にはいくつかの注意点があります。 PureComponent をさらに深く掘り下げて、なぜそれを使用する必要があるのか​​を理解しましょう。

Component と PureComponent には 1 つの違いがあります

PureCompoent是因为它是一个更具性能的Component的版本。虽然事实证明这是正确的,但是这种性能的提高还伴随着一些附加的条件。让我们深挖一下PureComponent,并理解为什么我们应该使用它。

Component和PureComponent有一个不同点

除了为你提供了一个具有浅比较的shouldComponentUpdate方法,PureComponentComponent基本上完全相同。当props或者state改变时,PureComponent将对propsstate进行浅比较。另一方面,Component不会比较当前和下个状态的propsstate。因此,每当shouldComponentUpdate被调用时,组件默认的会重新渲染。

浅比较101

当把之前和下一个的propsstate作比较,浅比较将检查原始值是否有相同的值(例如:1 == 1或者ture==true),数组和对象引用是否相同。

从不改变

您可能已经听说过,不要在propsstate中改变对象和数组,如果你在你的父组件中改变对象,你的“pure”子组件不将更新。虽然值已经被改变,但是子组件比较的是之前props的引用是否相同,而不会进行深度比较。

与此相反,你可以通过使用es6的assign方法或者数组的扩展运算符或者使用第三方库达到不可变性,来返回一个新的对象。

存在性能问题?

比较原始值值和对象引用是低消费操作。如果你有一列子对象并且其中一个子对象更新,对它们的propsstate进行检查要比重新渲染每一个子节点要快的多

其它解决办法

不要在render的函数中绑定值

假设你有一个项目列表,每个项目都传递一个唯一的参数到父方法。为了绑定参数,你可能会这么做:

<CommentItem likeComment={() => this.likeComment(user.id)} />
ログイン後にコピー

这个问题会导致每次父组件render方法被调用时,一个新的函数被创建,已将其传入likeComment。这会有一个改变每个子组件props的副作用,它将会造成他们全部重新渲染,即使数据本身没有发生变化。

为了解决这个问题,只需要将父组件的原型方法的引用传递给子组件。子组件的likeComment属性将总是有相同的引用,这样就不会造成不必要的重新渲染。

<CommentItem likeComment={this.likeComment} userID={user.id} />
ログイン後にコピー

然后再子组件中创建一个引用了传入属性的类方法:

class CommentItem extends PureComponent {
  ...
  handleLike() {
    this.props.likeComment(this.props.userID)
  }
  ...
}
ログイン後にコピー

不要在render方法里派生数据

考虑一下你的配置组件将从一系列文章中展示用户最喜欢的十篇文章。

render() {
  const { posts } = this.props
  const topTen = posts.sort((a, b) => b.likes - a.likes).slice(0, 9)
  return //...
}
ログイン後にコピー

每次组件重新渲染时topTen都将有一个新的引用,即使posts没有改变并且派生数据也是相同的。这将造成列表不必要的重新渲染。

你可以通过缓存你的派生数据来解决这个问题。例如,设置派生数据在你的组件state 浅い比較を行う ShouldComponentUpdate メソッドを提供することに加えて、PureComponent と <code>Component は基本的に同じです。 props または state が変更されると、PureComponentpropsstate を浅く変更します。 。一方、コンポーネントは、現在の状態と次の状態の propsstate を比較しません。したがって、 shouldComponentUpdate が呼び出されるたびに、コンポーネントはデフォルトで再レンダリングされます。

浅い比較 101

前後の propsstate を比較する場合、浅い比較は次のようになります。元の値が同じ値 (例: 1 == 1 または ture==true)、配列、および オブジェクト

は参考

同じですか?

決して変更しない

聞いたことがあるかもしれませんが、propsstate オブジェクトは変更しないでください。配列の場合、親コンポーネントのオブジェクトを変更しても、「純粋な」子コンポーネントは更新されません。値は変更されていますが、サブコンポーネントは詳細な比較を行わずに、以前の props 参照が同じかどうかを比較します。

対照的に、es6 assign メソッドまたは配列拡張子 operator を使用するか、サードパーティのメソッドを使用することができます。ライブラリは、新しいオブジェクトを返す不変性を実現します。

パフォーマンスの問題はありますか?

プリミティブ値とオブジェクト参照の比較は低コストの操作です。子のリストがあり、そのうちの 1 つが更新される場合、その propsstate をチェックする方が、各子を再レンダリングするよりもはるかに高速です

その他の解決策

render の関数で値をバインドしないでください項目のリストがあり、各項目が一意のパラメーターとして親メソッドに渡されると仮定します。パラメータをバインドするには、次のようにします:
componentWillMount() {
  this.setTopTenPosts(this.props.posts)
}
componentWillReceiveProps(nextProps) {
  if (this.props.posts !== nextProps.posts) {
    this.setTopTenPosts(nextProps)
  }
}
setTopTenPosts(posts) {
  this.setState({
    topTen: posts.sort((a, b) => b.likes - a.likes).slice(0, 9)
  })
}
ログイン後にコピー
この問題により、親コンポーネントの render メソッドが呼び出されるたびに新しい関数が作成され、それが likeComment に渡されます。これには、各子コンポーネントの props が変更されるという副作用があり、データ自体が変更されていない場合でも、すべての子コンポーネントが再レンダリングされます。 🎜🎜この問題を解決するには、親コンポーネントのプロトタイプ メソッドの参照を子コンポーネントに渡すだけです。子コンポーネントの likeComment 属性は常に同じ参照を持つため、不必要な再レンダリングは発生しません。 🎜rrreee🎜次に、受信属性を参照するクラス メソッドを子コンポーネントに作成します。 🎜rrreee

render メソッドでデータを導出しないでください

🎜構成コンポーネントは、一連の記事の中からユーザーのお気に入りの記事 10 件を表示します。 🎜rrreee🎜topTen は、posts が変更されておらず、派生データが同じであっても、コンポーネントが再レンダリングされるたびに新しい参照を持ちます。これにより、リストの不必要な再レンダリングが発生します。 🎜🎜この問題は、派生データをキャッシュすることで解決できます。たとえば、コンポーネントの state に派生データを設定して、投稿が更新された場合にのみ更新されるようにします。 🎜rrreee🎜 Redux を使用している場合は、派生データを結合してキャッシュするための「セレクター」を作成するために reselect を使用することを検討してください。 🎜🎜この記事の事例を読んだ後は、その方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。 🎜🎜推奨読書: 🎜🎜🎜 React でのライフサイクルの使用方法の詳細な説明🎜🎜🎜🎜 React でのコンポーネント通信の使用方法の詳細な説明🎜🎜

以上がComponentとPureComponentの違いを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Win11での管理者権限の取得について詳しく解説 Win11での管理者権限の取得について詳しく解説 Mar 08, 2024 pm 03:06 PM

Windows オペレーティング システムは世界で最も人気のあるオペレーティング システムの 1 つであり、その新バージョン Win11 が大きな注目を集めています。 Win11 システムでは、管理者権限の取得は重要な操作であり、管理者権限を取得すると、ユーザーはシステム上でより多くの操作や設定を実行できるようになります。この記事では、Win11システムで管理者権限を取得する方法と、権限を効果的に管理する方法を詳しく紹介します。 Win11 システムでは、管理者権限はローカル管理者とドメイン管理者の 2 種類に分かれています。ローカル管理者はローカル コンピュータに対する完全な管理権限を持っています

C++のmode関数の詳しい解説 C++のmode関数の詳しい解説 Nov 18, 2023 pm 03:08 PM

C++ のモード関数の詳細な説明 統計において、モードとは、一連のデータ内で最も頻繁に現れる値を指します。 C++ 言語では、モード関数を記述することによって、任意のデータセット内のモードを見つけることができます。モード関数はさまざまな方法で実装できます。一般的に使用される 2 つの方法を以下で詳しく紹介します。 1 つ目の方法は、ハッシュ テーブルを使用して各数値の出現回数をカウントすることです。まず、各数値をキー、出現回数を値とするハッシュ テーブルを定義する必要があります。次に、特定のデータセットに対して次を実行します。

Oracle SQLの除算演算の詳細説明 Oracle SQLの除算演算の詳細説明 Mar 10, 2024 am 09:51 AM

OracleSQL の除算演算の詳細な説明 OracleSQL では、除算演算は一般的かつ重要な数学演算であり、2 つの数値を除算した結果を計算するために使用されます。除算はデータベース問合せでよく使用されるため、OracleSQL での除算演算とその使用法を理解することは、データベース開発者にとって重要なスキルの 1 つです。この記事では、OracleSQL の除算演算に関する関連知識を詳細に説明し、読者の参考となる具体的なコード例を示します。 1. OracleSQL での除算演算

C++の剰余関数の詳しい解説 C++の剰余関数の詳しい解説 Nov 18, 2023 pm 02:41 PM

C++ の剰余関数の詳しい説明 C++ では、剰余演算子 (%) を使用して、2 つの数値を除算した余りを計算します。これは、オペランドが任意の整数型 (char、short、int、long など) または浮動小数点数型 (float、double など) になる二項演算子です。剰余演算子は、被除数と同じ符号の結果を返します。たとえば、整数の剰余演算の場合、次のコードを使用して実装できます。

Vue.nextTick関数の使い方と非同期更新での応用について詳しく解説 Vue.nextTick関数の使い方と非同期更新での応用について詳しく解説 Jul 26, 2023 am 08:57 AM

Vue.nextTick 関数の使い方と非同期更新での応用について詳しく説明 Vue の開発では、DOM を変更した直後にデータを更新したり、関連する操作が必要になったりするなど、データを非同期で更新する必要がある状況によく遭遇します。データが更新された直後に実行されます。このような問題を解決するために登場したのが、Vue が提供する .nextTick 関数です。この記事では、Vue.nextTick 関数の使用法を詳しく紹介し、コード例と組み合わせて、非同期更新でのアプリケーションを説明します。 1.Vue.nex

php-fpmのチューニング方法を詳しく解説 php-fpmのチューニング方法を詳しく解説 Jul 08, 2023 pm 04:31 PM

PHP-FPM は、PHP のパフォーマンスと安定性を向上させるために一般的に使用される PHP プロセス マネージャーです。ただし、高負荷環境では、PHP-FPM のデフォルト設定ではニーズを満たせない場合があるため、チューニングが必要です。この記事では、PHP-FPM のチューニング方法を詳しく紹介し、いくつかのコード例を示します。 1. プロセスの数を増やす デフォルトでは、PHP-FPM はリクエストを処理するために少数のプロセスのみを開始します。高負荷環境では、プロセス数を増やすことで PHP-FPM の同時実行性を高めることができます。

PHPモジュロ演算子の役割と使い方を詳しく解説 PHPモジュロ演算子の役割と使い方を詳しく解説 Mar 19, 2024 pm 04:33 PM

PHP のモジュロ演算子 (%) は、2 つの数値を除算した余りを取得するために使用されます。この記事では、モジュロ演算子の役割と使用法について詳しく説明し、読者の理解を深めるために具体的なコード例を示します。 1. モジュロ演算子の役割 数学では、整数を別の整数で割ると、商と余りが得られます。たとえば、10 を 3 で割ると、商は 3 になり、余りは 1 になります。モジュロ演算子は、この剰余を取得するために使用されます。 2. モジュロ演算子の使用法 PHP では、% 記号を使用してモジュロを表します。

Linuxシステムコールsystem()関数の詳細説明 Linuxシステムコールsystem()関数の詳細説明 Feb 22, 2024 pm 08:21 PM

Linux システム コール system() 関数の詳細説明 システム コールは、Linux オペレーティング システムの非常に重要な部分であり、システム カーネルと対話する方法を提供します。その中でも、system()関数はよく使われるシステムコール関数の一つです。この記事では、system() 関数の使用法を詳しく紹介し、対応するコード例を示します。システム コールの基本概念 システム コールは、ユーザー プログラムがオペレーティング システム カーネルと対話する方法です。ユーザープログラムはシステムコール関数を呼び出してオペレーティングシステムを要求します。

See all articles