記事ディレクトリ
- 1. React ライフサイクルの落とし穴を教えてください。それを避ける方法は?
- 2. Real diff アルゴリズムの仕組みを教えてください。
- 3. 調整段階で setState は何をしますか?
- 4. redux の実現原理について話し、コアコードを書きますか?
- 5. React 合成イベントの原理は何ですか?
- 6. React コンポーネント間の通信方法は?
- 7. 反応要素に $$type 属性があるのはなぜですか?
- 8. Connect コンポーネントの原理について教えてください。
- 9. ファイバー アーキテクチャについての理解を教えてください。それはどのような問題を解決しましたか?
- 10. redux ミドルウェアについての理解を教えてください。一般的に使用されるミドルウェアは何ですか? 実施原則?
- 11. React パフォーマンス最適化の手段は何ですか?
- 12. イベント ループについての理解を教えてください。
- 13. フロントエンドのクロスドメイン ソリューション?
- 14. 配列の一般的なメソッドと関数、少なくとも 15?
- 15. React render メソッドの原理、いつトリガーされますか?
- 16. Vue での mixin の理解について教えてください。
- 17. for...in ループと for...of ループの違いは何ですか?
- 18. Js のデータ型を判断する方法は? 少なくとも 5 つ名前を付けますか? 違いは何ですか?
- 19. Object.defineProperty() についての理解を教えてください。
- 20. webSocket についての理解を教えてください。
1. React ライフサイクルの落とし穴を教えてください。それを避ける方法は?
-
getDerivedStateFromProps
制御されているコンポーネントと制御されていないコンポーネントの区別をあいまいにするアンチパターンのコーディングが容易 -
componentWillMount
React
これは非推奨としてマークされており、推奨されていません. 主な理由は、新しい非同期アーキテクチャにより複数回呼び出されるため、ネットワーク要求とイベントバインディングcomponentDidMount
をに配置する必要があるためです. -
componentWillReceiveProps
また、主にパフォーマンスの問題により、非推奨getDerivedStateFromProps
とマークされ、。 -
shouldComponentUpdate
true
またはを返すことによって、false
新しいレンダリングをトリガーする必要があるかどうかを判断します。主にパフォーマンスの最適化に使用されます。 -
componentWillUpdate
また、新しい非同期レンダリング メカニズムのため、廃止され、推奨されません. 元のロジックを組み合わせgetSnapshotBeforeUpdate
てcomponentDidUpdate
変更することができます.
componentWillUnmount
関数でイベントのバインドを解除し忘れたり、タイマーやその他のクリーニング操作をキャンセルしたりすると、簡単に発生しますbug
。
エラー境界処理を追加しないと、レンダリングで例外が発生した場合、操作不能な白い画面が表示されるため、必ず追加してください。
2. Real diff アルゴリズムの仕組みを教えてください。
3. 調整段階で setState は何をしますか?
(1)setState
関数、React
受信パラメーター オブジェクトがコンポーネントの現在の状態とマージされ、いわゆる調整プロセス ( Reconciliation
) がトリガーされます。
(2) 調整プロセスの後、要素React
ツリーは比較的効率的な方法で新しい状態に従って構築され、UI インターフェイス全体が再レンダリングされます; (3) 要素ツリーが取得された、新しいツリーと古いツリーが自動的に計算され、差異に応じてインターフェイスの再レンダリングが最小限に抑えられます; (4) 差異計算アルゴリズムでは、どの位置がどのように変化したかを比較的正確に知ることができます。これにより、完全な再レンダリングではなく、オンデマンドの更新が保証されます。React
React
React
React
4. redux の実現原理について話し、コアコードを書きますか?
原理
- アプリケーションの状態を一元的に管理し
state
ます。store
state
reducer
関数は、使用済みのものをstate
更新するために新しいものを返すことです。store
state
redux
原則によれば、UI层
各状態の変更はaction
goによってトリガーされ、action
対応する に渡されreducer
、reducer
新しいstate
updatestore
に返されstate
、状態の更新が完了する必要があります。subscribe
これはstore
サブスクリプションリスナー関数であり、これらのサブスクライブされたリスナー関数は、dipatch
各開始後に順次実行されます。- ミドルウェアを追加して提出物
dispatch
を書き換えることができます
コア API
createStore
リポジトリを作成し、reducer
引数として受け入れますbindActionCreator
バインディングstore.dispatch
とaction
の関係combineReducers
複数のマージreducers
applyMiddleware
タマネギモデル用ミドルウェア、Betweendispatch
andaction
Between、リライトdispatch
compose
複数のミドルウェアを統合
5. React 合成イベントの原理は何ですか?
React
div
クリック イベントを実際のイベントに結び付ける代わりにDOM
、document
ここでサポートされているすべてのイベントをリッスンし、イベントが発生してどこにでもバブルが発生するとdocument
、React
イベントの内容がカプセル化され、実際の処理関数に渡されて実行されます。
収集されたイベントは配列に配置されdispatchQueue
、バブリングとキャプチャの違いは実行のタイミングと順序にあるため、異なる順序で配列をループするだけで済みます
まず、fiber
ノードがrender
ステージに入るとcomplete
、イベント リスナーがroot
それにバインドされます。次に、イベント バインディングを呼び出しensureListeningTo
、イベント合成オブジェクトを生成し、イベントを収集して、実際のイベントをトリガーします。
6. React コンポーネント間の通信方法は?
-
親コンポーネントから子コンポーネントへの通信:
親コンポーネントは、子コンポーネントに渡す方法で子コンポーネントとprops
通信できます。 -
子コンポーネントから親コンポーネントへの通信:
props
+Callback メソッド、親コンポーネントが子コンポーネントと通信するprops
、これはprops
スコープが親コンポーネント自体である関数であり、子コンポーネントはこの関数を呼び出し、子コンポーネントが渡したい情報はパラメータとして使用され、親コンポーネントのスコープに渡されます。 -
兄弟コンポーネント通信:
兄弟コンポーネント間で転送し、親コンポーネントを使用して転送することにより、親コンポーネントが中間層として機能し、データ相互通信を実現します。 例: コンポーネント A
– 値を渡す --> 親コンポーネント – 値を渡す -->コンポーネント B -
クロスレベル通信:
Context
設計目的は、
コンポーネント ツリーの「グローバル」なデータを共有することです.
これを使用すると、context
コンポーネント間の通信方法が提供され、データを共有でき、他のデータは対応するデータを読み取ることができます
.ユーザー、サブジェクト、または優先言語は、複数のレイヤー間でグローバル データContext
を通信する。 -
パブリッシュ-サブスクライバー モード:
パブリッシャーはイベントをパブリッシュし、サブスクライバーはイベントをリッスンして応答します。event
モジュールを導入することで通信できます。 -
グローバル状態管理ツール:グローバル状態センターを維持し、さまざまなイベントに応じて新しい状態を生成する、またはなどのグローバル状態管理ツール
と通信します。Redux
Mobx
Store
7. 反応要素に $$type 属性があるのはなぜですか?
を防ぐのが目的XSS 攻击
です。Synbol
シリアル化できないため、現在のオブジェクトがデータベースからのものか、それ自体で生成されたものかは、属性React
の有無によって判断できます。この属性がない場合、要素の処理は拒否されます。$$typeof
element
$$typeof
react
8. Connect コンポーネントの原理について教えてください。
connect
これは高階関数であり、実際にRedux
はReact
コンテナー コンポーネントの外層に接続してラップされProvider
、上記によって提供されたand をstore
受け取り、それをコンストラクターに渡し、オブジェクトを返し、それをコンテナー コンポーネントに渡します。プロパティの形式。原則:最初に,を渡し、次に生成された関数 ( )を返し、次にパラメータとして実数を渡すことで、ラップされたコンポーネントが生成されます。state
dispatch
mapStateToProps
mapDispatchToProps
Component
wrapWithConnect
Component
wrapWithConnect
Connect
(1) を含むprops.store
祖先Component
( store
2)を組み合わせて を取得し、実体に渡す( 3)ページ インタラクションを実現するイベントを追加する(4)レンダリングを回避してページのパフォーマンスを向上させるかどうかを判断し、取得する(5)登録したイベントを削除する場合props
stateProps
dispatchProps
parentProps
nextState
props
Component
componentDidMount
this.store.subscribe(this.handleChange)
shouldComponentUpdate
nextState
componentWillUnmount
this.handleChange
9. ファイバー アーキテクチャについての理解を教えてください。それはどのような問題を解決しましたか?
解決すべき問題:
JavaScript
エンジンとページ レンダリング エンジンの 2 つのスレッドは相互に排他的です. スレッドの 1 つが実行されると、他のスレッドはハングして待機することしかできません.JavaScript
スレッドが、レンダリング レベルの更新を実行できません。長時間待たないでください。インターフェイスが長時間更新されないため、ページの応答性が低下し、ユーザーが立ち往生する可能性があります。
理解:
React Fiber
これは、主要な変更と最適化React
が行われ、React
コア アルゴリズムが再実装されたものです。
主に行われた:
- それぞれに優先度が追加され、優先度の高いタスクは優先度の低いタスクに割り込むことができます。その後再起動、優先度の低いタスクの再実行に注意
requestIdleCallback api
ブラウザがアイドル状態のときに実行される非同期タスクの呼び出しを追加dom diff
ツリーはリンクされたリストになり、1 つがdom
2 つに対応しfiber
(リンクされたリスト)、2 つのキューに対応し、すべて中断されたタスクを見つけて再実行します。
10. redux ミドルウェアについての理解を教えてください。一般的に使用されるミドルウェアは何ですか? 実施原則?
理解:
ミドルウェアとは、アプリケーションシステムとシステムソフトウェアの間のソフトウェアの一種で、システムソフトウェアが提供する基本的なサービス(機能)を利用して、アプリケーションシステムの各部分やネットワーク上の異なるアプリケーションを接続し、リソースの共有と機能の共有を実現します。の目標
Redux
プロセスでは、ミドルウェアをdispatch
プロセスに配置し、action
傍受プロセスをディストリビューションで実行します。
基本的に関数であり、発行と実行の 2 つのステップの間にstore.dispatch
メソッドが変換されAction
、他の関数が追加されます。Reducer
一般的に使用されるミドルウェア:
redux-thunk
: 非同期操作用
redux-logger
: ロギング用
実装原則:
すべてのミドルウェアは配列に入れられchain
、ネストされて実行され、最後に実行されますstore.dispatch
。middlewareAPI
ミドルウェアの内部 ( ) を取得できgetState
、dispatch
これら 2 つのメソッドがdispatch
判断を下し、対応する操作を実行することがわかります。
11. React パフォーマンス最適化の手段は何ですか?
- 純粋なコンポーネントを使用してください。
- コンポーネント メモリ (高レベル コンポーネント)
React.memo
に使用します。同じ入力に対して、実行を繰り返さないでください。React.memo
- クラス コンポーネントの場合は、
shouldComponentUpdate
ライフ サイクル イベントを使用します (これは、コンポーネントを再レンダリングする前にトリガーされるライフ サイクル イベントの 1 つです)。このイベントを使用して、いつコンポーネントを再レンダリングする必要があるかを判断できます。 - 遅延読み込みをルーティングします。
React Fragments
余分なマークアップを避けるために使用します。- インライン関数定義を使用しないでください (インライン関数を使用すると、
render
" " 関数が呼び出されるたびに新しい関数インスタンスが作成されます)。 Willxxx
シリーズのライフサイクル中は、非同期のリクエストや操作などを避けてくださいdom
。- クラス コンポーネントの場合、イベント関数はポインターを変更する
Constructor
ようにバインドされています。bind
this
- インライン スタイル属性の使用は避けてください。
React
での条件付きレンダリングの最適化。render
メソッドでデータをエクスポートしないでください。- リストがレンダリングされるときに追加されます
key
。 - 関数コンポーネントで
useCallback
andを使用しuseMemo
てコンポーネントを最適化します。依存関係に変更がない場合、繰り返し実行されません。 - クラス コンポーネントで使用されるオブジェクト
immutable
。
12. イベント ループについての理解を教えてください。
js でタスクを処理するための特定の操作メカニズムであるイベント ループ。
非同期タスクと同期タスクを実行すると、非同期実行が開始された後、次の同期タスクを実行できません. イベント ループは、タスクを同期タスクと非同期タスクに分割します. 同期タスクに遭遇した場合は、直接実行し、非同期タスクに遭遇します.メインスレッドの実行に影響を与えないように、タスクキューで実行します。
その中で、非同期タスク キューもマクロ タスクとマイクロ タスクに分けられ、マクロ タスクが最初に実行され、次にマイクロ タスクが実行されます。
このようにイベントループが繰り返し形成される。
13. フロントエンドのクロスドメイン ソリューション?
- jsonp によるクロスドメイン
- document.domain + iframe クロスドメイン
- location.hash + iframe window.name + iframe クロス ドメイン
- postMessage クロスドメイン
- クロスオリジン リソース共有 (CORS)
- nginx プロキシ クロスドメイン
- nodejs ミドルウェア プロキシ クロスドメイン
- クロスドメイン WebSocket プロトコル
14. 配列の一般的なメソッドと関数、少なくとも 15?
Array.length:
配列内の要素数を取得または設定しますArray.from() :
疑似配列または反復可能なオブジェクト (arguments
、Array
、Map
、... を含む) を配列オブジェクトに変換しますSet
。String
Array.isArray():
渡された値がArray
concat():
2 つ以上の配列をマージする方法。このメソッドは既存の配列を変更しませんが、新しい配列を返します。every(callback):
メソッドは、配列のすべての要素が指定された関数のテストに合格するかどうかをテストしますfilter():
指定された関数によって満たされたテストのすべての要素を含む新しい配列を作成しますfind():
指定されたテスト関数を満たす配列内の最初の要素の値を返しますforEach():
メソッドは、配列の要素ごとに指定された関数を 1 回実行しますincludes():
配列に指定された値が含まれているかtrue
どうfalse
indexOf():
指定された要素が見つかる配列内の最初のインデックスを返します。存在しない場合は -1 を返します。join():
配列 (または配列のようなオブジェクト) のすべての要素を文字列に連結しますlastIndexOf():
指定された要素 (つまり、有効なJavaScript
値。存在しない場合は -1 を返します。配列の後ろから前を向くmap():
配列内の各要素に対して指定された関数を呼び出した結果が結果となる新しい配列を作成しますpop():
配列から最後の要素を削除し、その要素の値を返します。このメソッドは配列の長さを変更しますpush():
配列の末尾に 1 つ以上の要素を追加しますreduce():
アキュムレータと配列内の各要素に関数を適用します (左から右へ)shift():
配列から最初の要素を削除し、その要素の値を返します。このメソッドは配列の長さを変更しますslice():
最初から最後まで (最後を含まない) 選択された配列の一部の浅いコピーを新しい配列オブジェクトに返しますsome():
配列内の特定の要素が、提供された関数によって実装されたテストに合格するかどうかをテストします。sort():
配列の要素を位置でソートし、配列を返します。splice():
既存の要素を削除したり、新しい要素を追加したりして、配列の内容を変更しますtoString():
指定された配列とその要素を表す文字列を返しますunshift():
配列の先頭に 1 つ以上の要素を追加し、新しい配列の長さを返しますtoLocaleString():
配列内の要素を表す文字列を返します。配列内の要素はそれぞれのtoLocaleString
メソッド、これらの文字列はロケール固有の文字列 (カンマ「,」など) で区切られます。
15. React render メソッドの原理、いつトリガーされますか?
原則:
クラス コンポーネントではrender
関数はrender
メソッドを参照し、関数コンポーネントでは関数コンポーネント全体を参照します。
render
関数内のステートメントはjsx
、使い慣れた js コードにコンパイルされます. このrender
プロセスでは、react
新しく呼び出されたrender
関数によって返されたツリーが古いバージョンのツリーと比較されます. このステップは、どのように実行するかを決定するために必要なステップです. DOM を更新し、DOM ツリーをdiff
比較し更新する
トリガーのタイミング:
クラス コンポーネントの呼び出しにより、状態がsetState
変更されます
関数コンポーネントはuseState hook
状態を次のように変更します
一度実行すると、メソッドsetState
が実行され、現在の値が変更されたかどうかでメソッドを実行するかどうかが判断されます. 親コンポーネントがレンダリングされると、子コンポーネントもレンダリングされます.render
useState
render
16. Vue での mixin の理解について教えてください。
mixin
これはのファイルであるクラスであり、その主な機能はそれを汎用モジュールとして参照することvue
です。js
プロジェクト内では、コントロール要素の表示と非表示など、異なるコンポーネントが同じ機能を持っている場合があるため、それらの変数とルールもまったく同じである場合は、この機能を個別に抽出して挿入し、インポートすることができますmixin.js
。同じ機能を実現できます。導入方法もグローバルミックスインとローカルミックスインに分かれており、ローカルミックスインはコンポーネントごとに、グローバルミックスインはmain.jsにVue.mixin()
導入されています。
17. for...in ループと for...of ループの違いは何ですか?
for...in
ループ:キーの値ではなく、オブジェクトのキー名しか取得できない
for…in
ループにはいくつかのデメリットがある
①配列のキー名は数字だが、for…in
ループはキー名として文字列を使う 「0」、「1」、 「2」など。
②for…in
ループは数字キーの名前だけでなく、手動で追加された他のキーも横断します。プロトタイプ チェーンのキーも含まれます。
③場合によっては、for…in
ループはキー名を任意の順序でトラバースします。
for…in
ループは主に、配列ではなくオブジェクトを反復処理するために設計されています。
for...of
ループ: トラバーサルでキーと値の
for…of
ループを取得できるようにします。
① はfor…in
同じ簡潔な構文ですが、for…in
これらの欠点はありません。
②方法とは異なり、 、 、とforEach
組み合わせて使用できます。 ③すべてのデータ構造を横断するための統一された操作インターフェースを提供するbreak
continue
return
18. Js のデータ型を判断する方法は? 少なくとも 5 つ名前を付けますか? 違いは何ですか?
1.typeof
typeof
返された型が文字列であると判断する
2.Constructor
instanceconstructor
属性がコンストラクタ自身を指している
constructor
判断方法はinstanceof
似ていますが、constructor
検出方法が異なりObject
ますinstanceof
.constructor
オブジェクト型
3.Instanceof
instanceof
型かどうかを判断できる インスタンスのコンストラクタです.
instanceof
その後にオブジェクト型が続く必要があり, 大文字小文字を間違えてはなりません. この方法は, 条件付き選択や分岐に適しています.
4. 型Object.prototype.toString.call()
のプロトタイプ オブジェクトがオブジェクトのプロトタイプ チェーン上にあるかどうかの判断
5.object
プロトタイプのメソッドによる判断、
たとえばarray.isArray()
配列であるかどうかの判断
6. === (厳密な演算子) は
通常、私たちの条件判定、データ型の判定に使用すると、変数が空かどうか、変数がデータかどうかなどの判定など、非常に限定的になります。
19. Object.defineProperty() についての理解を教えてください。
Object.defineProperty()
メソッドは、オブジェクトで直接新しいプロパティを定義するか、オブジェクトの既存のプロパティを変更して、オブジェクトを返します。
このメソッドは 3 つのパラメーターを受け入れます
- 最初のパラメーターは次のとおりです
obj
。プロパティが定義されるオブジェクト、 - 2 番目のパラメーターは次のとおりです
prop
。定義または変更するプロパティの名前またはSymbol
、 - 3 番目のパラメーターは次のとおりです
descriptor
。定義または変更する属性記述子
関数の 3 番目のパラメーターdescriptor
で表される属性記述子には、データ記述子とアクセス記述子の2 つの形式があります。
- データ記述子は値を持つ属性であり、書き込み可能または書き込み可能でない場合があります。
- アクセス記述子は、関数および関数によって記述される属性
getter
です。setter
記述子は、これら 2 つのいずれかのみであり、両方であることはできません。
これら 2 つのタイプには、次のキー値があります。
configurable
:対象の属性を削除できるかどうか、または属性のプロパティを再度変更できるかどうか ( writable
、configurable
、enumerable
)。true
削除可能またはプロパティをリセットできるように設定します。 に設定するfalse
と、削除可能またはプロパティをリセットできなくなります。デフォルトは ですfalse
。
enumerable
:プロパティのenumerable
キー値がtrue
オブジェクトの列挙プロパティに表示されます。デフォルトは ですfalse
。
20. webSocket についての理解を教えてください。
Comprehensionは、次の新しいプロトコル
WebSocket
です( protocol は基本的に、に基づくプロトコルです。HTML5
websocket
tcp
ブラウザとサーバー間の全二重通信を実現し、サーバーのリソースと帯域幅をより節約し、リアルタイム通信の目的を達成できます
Websocket は永続的なプロトコルです
この原理
websocket
では、通信仕様が規定されており、ハンドシェイク メカニズムを使用して、クライアントとサーバー間で同様のtcp
接続を確立し、それらの間の通信を容易にします。
それが現れる前はwebsocket
、web
相互作用は一般的にhttp协议
短い接続または長い接続に基づいていました
websocket
http ステートレス プロトコルに属さない新しいプロトコルで、プロトコル名は「ws」です。