私は今回は、Component と PureComponent の使用の違いについて詳しく説明します。Component と PureComponent を使用する際の 注意事項 は何ですか? 以下は実際のケースです。
PureCompoent
の使用に切り替え始めました。これは、Component
のよりパフォーマンスの高いバージョンであるためです。これは事実であることが判明しましたが、このパフォーマンスの向上にはいくつかの注意点があります。 PureComponent
をさらに深く掘り下げて、なぜそれを使用する必要があるのかを理解しましょう。
Component と PureComponent には 1 つの違いがあります
PureCompoent
是因为它是一个更具性能的Component
的版本。虽然事实证明这是正确的,但是这种性能的提高还伴随着一些附加的条件。让我们深挖一下PureComponent
,并理解为什么我们应该使用它。Component和PureComponent有一个不同点
除了为你提供了一个具有浅比较的shouldComponentUpdate
方法,PureComponent
和Component
基本上完全相同。当props
或者state
改变时,PureComponent
将对props
和state
进行浅比较。另一方面,Component不会比较当前和下个状态的props
和state
。因此,每当shouldComponentUpdate
被调用时,组件默认的会重新渲染。
浅比较101
当把之前和下一个的props
和state
作比较,浅比较将检查原始值是否有相同的值(例如:1 == 1
或者ture==true
),数组和对象引用是否相同。
从不改变
您可能已经听说过,不要在props
和state
中改变对象和数组,如果你在你的父组件中改变对象,你的“pure”子组件不将更新。虽然值已经被改变,但是子组件比较的是之前props
的引用是否相同,而不会进行深度比较。
与此相反,你可以通过使用es6的assign方法或者数组的扩展运算符或者使用第三方库达到不可变性,来返回一个新的对象。
存在性能问题?
比较原始值值和对象引用是低消费操作。如果你有一列子对象并且其中一个子对象更新,对它们的props
和state
进行检查要比重新渲染每一个子节点要快的多
其它解决办法
不要在render的函数中绑定值
假设你有一个项目列表,每个项目都传递一个唯一的参数到父方法。为了绑定参数,你可能会这么做:
<commentitem> this.likeComment(user.id)} /></commentitem>
这个问题会导致每次父组件render方法被调用时,一个新的函数被创建,已将其传入likeComment
。这会有一个改变每个子组件props
的副作用,它将会造成他们全部重新渲染,即使数据本身没有发生变化。
为了解决这个问题,只需要将父组件的原型方法的引用传递给子组件。子组件的likeComment
属性将总是有相同的引用,这样就不会造成不必要的重新渲染。
<commentitem></commentitem>
然后再子组件中创建一个引用了传入属性的类方法:
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
が変更されると、PureComponent
は props
と state
を浅く変更します。 。一方、コンポーネントは、現在の状態と次の状態の props
と state
を比較しません。したがって、 shouldComponentUpdate
が呼び出されるたびに、コンポーネントはデフォルトで再レンダリングされます。
浅い比較 101
前後の props
と state
を比較する場合、浅い比較は次のようになります。元の値が同じ値 (例: 1 == 1
または ture==true
)、配列、および オブジェクト
同じですか?
決して変更しない
聞いたことがあるかもしれませんが、props
と state
オブジェクトは変更しないでください。配列の場合、親コンポーネントのオブジェクトを変更しても、「純粋な」子コンポーネントは更新されません。値は変更されていますが、サブコンポーネントは詳細な比較を行わずに、以前の props
参照が同じかどうかを比較します。
対照的に、es6 assign メソッドまたは配列拡張子 operator を使用するか、サードパーティのメソッドを使用することができます。ライブラリは、新しいオブジェクトを返す不変性を実現します。
パフォーマンスの問題はありますか?
プリミティブ値とオブジェクト参照の比較は低コストの操作です。子のリストがあり、そのうちの 1 つが更新される場合、そのprops
と state
をチェックする方が、各子を再レンダリングするよりもはるかに高速です
その他の解決策
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🎜次に、受信属性を参照するクラス メソッドを子コンポーネントに作成します。 🎜rrreeerender メソッドでデータを導出しないでください
🎜構成コンポーネントは、一連の記事の中からユーザーのお気に入りの記事 10 件を表示します。 🎜rrreee🎜topTen
は、posts
が変更されておらず、派生データが同じであっても、コンポーネントが再レンダリングされるたびに新しい参照を持ちます。これにより、リストの不必要な再レンダリングが発生します。 🎜🎜この問題は、派生データをキャッシュすることで解決できます。たとえば、コンポーネントの state
に派生データを設定して、投稿が更新された場合にのみ更新されるようにします。 🎜rrreee🎜 Redux を使用している場合は、派生データを結合してキャッシュするための「セレクター」を作成するために reselect を使用することを検討してください。 🎜🎜この記事の事例を読んだ後は、その方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。 🎜🎜推奨読書: 🎜🎜🎜 React でのライフサイクルの使用方法の詳細な説明🎜🎜🎜🎜 React でのコンポーネント通信の使用方法の詳細な説明🎜🎜以上がComponentとPureComponentの違いを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、
