この記事では、Vue の面接での 20 の質問とその回答の分析をまとめました。一定の参考値があるので、困っている友達が参考になれば幸いです。
[推奨される関連する面接の質問:vue の面接の質問(2021)]
レンズ 黄色と黒のチェック柄のシャツを見たとき、私の前に座っている面接官は悪意を持って来たに違いないと気づきました。
いつものように、3 分間かけて自己紹介をさせていただきます。この間、恥ずかしさを避けるために私は面接官の眉間を見つめていましたが、面接官は明らかに私の経験にあまり興味がありませんでした。彼は1分半の時点で私の話を中断した。
自分が最も得意としているテクノロジースタックは何だと思いますか?
Vue、Youda がとても好きです。Vue の最初のドキュメンタリーが最近公開されたばかりです。見るのはとてもいいです。
MVVM はModel-View-ViewModel
の略称で、MVC
のController
を次のように進化させたものです。ViewModel
。モデル レイヤーはデータ モデルを表し、ビューは UI コンポーネントを表し、ViewModel はビュー レイヤーとモデル レイヤー間のブリッジです。データは viewModel レイヤーにバインドされ、自動的にデータをページにレンダリングします。ビューが変更されると、 、データを更新するように viewModel レイヤーに通知されます。 (学習ビデオ共有:vue ビデオ チュートリアル)
Vueデータを初期化するとき、Object.defineProperty
を使用して、データ内のすべてのプロパティを再定義します。ページが対応するプロパティを使用するとき、依存関係の収集が最初に実行されます (##watcherを収集します)。現在のコンポーネント)プロパティが変更された場合、関連する依存関係に更新操作 (
パブリッシュおよびサブスクライブ) が通知されます。
Proxyを使用します。 Object.defineProperty 。なぜなら、Proxy はオブジェクトや配列の変更を直接監視でき、13 ものインターセプト メソッドを備えているからです。また、新しい標準として、ブラウザのメーカーによる継続的なパフォーマンスの最適化の対象となります。
reactiveメソッドを使用してプロキシとして機能します。
こうして深い観察を実現しました。
(プロトタイプ チェーンの詳細については、次を参照してください)私の他の記事 コラム)
(マクロ タスク、マイクロ タスク、およびイベント ループの詳細については、私の他の 2 つのコラムを参照してください) (これを見た後、実際に質問するとわかります。基本的な JavaScript スキル)
##beforeCreateが new Vue() の後にトリガーされる最初のフックでは、現在のステージではデータ、メソッド、計算済み、および監視上のデータとメソッドにアクセスできません。
createdインスタンスの作成後に発生します。現段階でデータの観測は完了しています。つまり、データの使用と変更が可能です。ここでデータを変更しても変更はされません。更新された関数をトリガーします。初期データの取得を実行できます。現在の段階では Dom と対話できません。必要な場合は、vm.$nextTick を通じて Dom にアクセスできます。
beforeMountマウント前に発生します。その前に、テンプレートがインポートされ、レンダリング関数でコンパイルされます。現段階では、仮想 Dom が作成され、レンダリングが開始されるところです。この時点でデータを変更することもできますが、更新はトリガーされません。
mountedマウント完了後に発生します。現段階では、実際の Dom がマウントされ、データが双方向にバインドされ、Dom ノードにアクセスでき、Dom にアクセスできます。 $refs 属性を使用して操作します。
beforeUpdate更新前に発生します。つまり、応答データが更新され、再レンダリングの前に仮想 dom がトリガーされます。再レンダリングを発生させることなく、現在のステージでデータを変更できます。レンダリング。
updated更新が完了し、現在のステージのコンポーネント Dom が更新された後に発生します。更新の無限ループが発生する可能性があるため、この期間中にデータを変更しないように注意してください。
beforeDestroyインスタンスが破棄される前に発生します。インスタンスは現在の段階で完全に使用できます。この時点で、タイマーのクリアなどの後処理の仕上げ作業を実行できます。
destroyedインスタンスが破棄された後に発生し、この時点では dom シェルのみが残ります。コンポーネントは逆アセンブルされ、データ バインディングは削除され、リスナーは削除され、すべての子インスタンスは破棄されました。
(Vue のライフ サイクルの詳細な説明に興味がある場合は、私の他のコラムを参照してください)## 6. インターフェイスのリクエストは通常どのライフサイクルに置かれますか?
に配置されますが、サーバー側のレンダリングはマウントをサポートしていないため、created に配置する必要があることに注意してください。
。
は本質的に、キャッシュと依存プロパティを備えたウォッチャーです。変更が発生するとビューが更新されます。計算に比較的高いパフォーマンスを消費するコンピューティング シナリオに適しています。式が複雑すぎる場合、テンプレートにロジックを追加しすぎると、テンプレートの保守が困難になります。複雑なロジックを計算プロパティに含めることができます。
キャッシュはなく、むしろ監視機能であり、特定のデータを監視し、コールバックを実行できます。オブジェクト内のプロパティを詳細に監視する必要がある場合は、deep: true
オプションをオンにして、オブジェクト内の各項目が監視されるようにします。これによりパフォーマンスの問題が発生します。最適化するには、文字列形式
を使用して監視できます。コンポーネントに書き込まれていない場合は、unWatch を使用して手動で
をログアウトすることを忘れないでください。
DOM 要素はレンダリングされません。v-show
はスタイル (表示) を操作し、現在の DOM の表示と非表示を切り替えます。
。データがオブジェクトの場合、そのオブジェクトは参照型であり、すべてのインスタンスに影響します。したがって、コンポーネントの異なるインスタンス間でデータが競合しないようにするには、データは関数である必要があります。
は本質的には構文糖衣です。これは、value input
メソッドの糖衣構文であることがわかります。モデル属性の
prop
属性とevent
属性を使用してカスタマイズできます。ネイティブ v-model は、さまざまなタグに基づいてさまざまなイベントと属性を生成します。
を通じて実際の要素にバインドされます。イベント バインディングは、Vue のカスタム$on
を通じて実装されます。
インタビュアー: (この子の基本はかなり上手です。次はさらに高度なものにならなければなりません)
をrender
関数に変換するプロセスです。次の段階を経ます:
(テンプレート全体を記述する JavaScript オブジェクトの形式) を生成します。多数の正規表現を使用してテンプレートを解析し、ラベルやテキストに遭遇すると、関連する処理のために対応するフックが実行されます。
Vue のデータは応答性がありますが、実際にはテンプレート内のすべてのデータが応答性があるわけではありません。一部のデータは最初にレンダリングされた後は変更されず、対応する DOM も変更されません。次に、最適化プロセスでは、AST ツリーを深く探索し、関連する条件に従ってツリー ノードにマークを付けます。これらのマークされたノード (静的ノード) の比較をスキップできます。これにより、ランタイム テンプレートが大幅に最適化されます。
最適化された AST ツリーを実行可能コードに変換することです。
ですが、実際の状況ではcross Hierarchical mobile DOM
を実行することはほとんどないため、Vue は Diff fromO(n^3) -> O(n)## を最適化します。 #. これは、古い子と新しい子が複数の子ノードである場合にのみ必要です。コア Diff アルゴリズムは、同じレベルの比較を実行します。
Vue2 のコア Diff アルゴリズムは
両端比較
Vue3.x は、
アルゴリズムと
infernoアルゴリズムを利用して、VNode の作成時にそのタイプを決定します。 # # マウント/パッチは、
を使用して VNode のタイプを決定します。これに基づいて、コア Diff アルゴリズムと組み合わせることで、Vue2.x と比較してパフォーマンスが向上します。 (実際の実装は、Vue3.x ソース コードと併せて参照できます。)このアルゴリズムでは、最も長い再帰サブシーケンスを解決するために、
動的プログラミング
の考え方も使用されています。
(これを見れば、データ構造とアルゴリズムの魅力がフレームワークの随所にあることがわかります)インタビュアー: (分かった、分かった、苗木のようですが、自己紹介をしたいと思います。本当に少し退屈です、次の質問)
(基本、6はやらないでください)
14. 仮想 Dom の役割について話しましょうおよび主要な属性Vue2 の仮想 DOM は、オープン ソース ライブラリ
snabbdom
の実装を利用しています。
Virtual DOM の本質は、ネイティブ JS オブジェクトを使用して DOM ノードを記述することです。これは、実際の DOM からの抽象化レイヤーです。
(つまり、src/core/vdom/vnode.js で定義されているソース コード内の VNode クラスです。)
VirtualDOM を実際の DOM にマッピングするには、create、diff、 VNode のパッチおよびその他のステージ。
古い子と新しい子のノードの順序だけが異なる場合、要素の位置を移動することで更新の目的を達成するのが最善の操作です。再利用可能なノードが古い子のノードで見つかるように、古い子のノードと新しい子のノードにマッピング関係を保存する必要があります。キーは、子のノードの一意の識別子です。
15. キープアライブについてご存知ですか?一般的に使用される 2 つの属性
include/exclude
を使用すると、コンポーネントを条件付きでキャッシュできます。
2 つのライフ サイクルアクティブ化/非アクティブ化
。現在のコンポーネントがアクティブかどうかを知るために使用されます。
キープアライブでは、LRU (最も最近使用されていない)
アルゴリズムも使用されます。
(再びデータ構造とアルゴリズムです。アルゴリズムにはフロントエンドにも非常に多くのアプリケーションがあることがわかりました)
です。コンポーネントの破棄操作は、
最初に親、次に息子
であり、破棄の完了順序は
です。 。レンダリング プロセスの読み込み
作成前の親 ->作成された親 ->マウント前の親 ->作成前の子 ->作成された子 - > マウント前の子 - > マウントされた子 - > マウントされた親
#サブコンポーネント更新プロセス
更新前の親 ->更新前の子 ->更新された子の子 ->更新された親
#親コンポーネントの更新プロセス
parentbeforeUpdate -> 親が更新されました
#破棄プロセス
##親の破棄前 ->子の前の破棄 ->子が破棄 ->親の破棄#17.Vue2.x コンポーネントと通信する方法は何ですか?
, 子->親
$on, $放出親子コンポーネントのインスタンスの取得
$parent, $children
Ref
コンポーネントのプロパティを呼び出してインスタンスを取得するか、メソッド
Provide、inject
公式には推奨されていませんが、コンポーネント ライブラリを作成するときに非常によく使用されます
兄弟コンポーネント通信
Vuex
コンポーネント間通信
$attrs、$listeners
提供、注入
#18 .SSRってわかりますか?
SSR には、SEO が向上し、最初の画面の読み込み速度が速くなるという利点があります。ただし、開発条件が限定される、サーバーサイドレンダリングではbeforeCreate
と
created
19. Vue でどのようなパフォーマンスの最適化を行いましたか?
データ内のデータとデータを削減してみます。データ内のゲッターとセッターを追加すると、対応するウォッチャーが収集されます
v-if と v-for は一緒に使用できません
プリレンダリングサーバーサイド レンダリング SSR
圧縮コードツリー シェイキング/Scope Hoisting
cdn を使用してサードパーティ モジュールをロードスケルトン画面PWA
history は実際には、HTML5 で提供される API を使用して実装されます。主に
history.pushState()と
history.replaceState()
が含まれます。
面接官は隣にあった冷たいコーヒーを手に取り、一口飲みました。(この人にもっと質問してもいいですか?)
プログラミング関連の知識については、
をご覧ください。 !
以上が20 以上の知っておくべき Vue 面接の質問 (回答分析付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。