Vueカスタムディレクティブの詳細

Vueカスタムディレクティブの詳細

1. 背景

最近、就職面接を受けたのですが、面接官からカスタム ディレクティブについて質問されました。カスタム ディレクティブはあまり使わないので、公式ドキュメントを読んだだけで、ディレクティブをカスタマイズするにはVue.directiveを使う必要があることは大体わかりました。面接後、すぐにオンラインでカスタム ディレクティブに関する情報を探したところ、カスタム ディレクティブについて学ぶべきことがまだまだたくさんあることがわかったので、それを記録するとともに、もっと挑戦して学ぼうという気持ちを奮い立たせるためにブログを書こうと思いました。 ! !

これはカスタム命令に関する公式ドキュメントモジュールです。カスタム命令には、グローバルカスタム命令とローカルカスタム命令が含まれます。

2. ローカルカスタム指示

ローカル ディレクティブを登録する場合、コンポーネントはdirectivesオプションも受け入れます。

@成分({
  名前: "CustomDirectives",
  コンポーネント: {},
  ディレクティブ: {
    // ローカルカスタムディレクティブ custom1: {
      挿入(el) {
        console.log("el", el);
        el.style.position = "絶対";
        el.style.top = "50%";
        el.style.left = "50%";
        el.style.transform = "translate(-50%,-50%)";
        el.innerText = "読み込み中...";
        el.style.padding = "10px";
        el.style.color = "#333";
      },
    },
  },
})

3. グローバルカスタム指示

Vue.directive("custom2", {
  挿入(el, バインディング) {
    console.log("バインディング", バインディング);
    if (バインディング && バインディング値) {
      el.innerText = "グローバルカスタム命令をテストします";
      console.log("el", el);
      el.style.position = "絶対";
      el.style.top = "50%";
      el.style.left = "50%";
      el.style.transform = "translate(-50%,-50%)";
      el.style.padding = "10px";
      el.style.color = "#333";
    }
  },
});

4.1 カスタムコマンドフック関数

  • bind : ディレクティブが要素に最初にバインドされるときに 1 回だけ呼び出されます。ここで、1 回限りの初期化セットアップを実行できます。
  • inserted : バインドされた要素が親ノードに挿入されたときに呼び出されます (親ノードが存在することは保証されますが、必ずしもドキュメントに挿入されているとは限りません)。
  • update : コンポーネントのVNodeが更新されたときに呼び出されますが、その子VNodeが更新される前に発生することもあります。命令の値は変更されている場合と変更されていない場合があります。ただし、更新前と更新後の値を比較することで、不要なテンプレートの更新を無視することができます (詳細なフック関数のパラメータについては以下を参照してください)。
  • componentUpdated : 命令が配置されているコンポーネントの VNode とその子 VNode がすべて更新された後に呼び出されます。
  • unbind : ディレクティブが要素からアンバインドされたときに 1 回だけ呼び出されます。

4.2 フック関数のパラメータ

  • el : 命令がバインドされる要素。これを使用して DOM を直接操作できます。
  • binding : オブジェクト、

次のプロパティが含まれます:

  • name : v- プレフィックスを除いたディレクティブの名前。
  • value : ディレクティブのバインディング値。たとえば、v-my-directive="1 + 1" の場合、バインディング値は 2 です。
  • oldValue : ディレクティブ バインディングの前の値。update フックと componentUpdated フックでのみ使用できます。値が変更されたかどうかに関係なく使用できます。
  • expression : 文字列形式のディレクティブ式。たとえば、v-my-directive="1 + 1" の場合、式は "1 + 1" になります。
  • arg : コマンドに渡されるパラメータ(オプション)。たとえば、v-my-directive:foo の場合、パラメーターは "foo" です。
  • modifiers : 修飾子を含むオブジェクト。たとえば、v-my-directive.foo.bar では、修飾子オブジェクトは { foo: true, bar: true } です。
  • vnode : Vue コンパイルによって生成される仮想ノード。詳細については、VNode API を参照してください。
  • oldVnode : 以前の仮想ノード。update フックとcomponentUpdatedフックでのみ使用できます。

4.3 動的命令パラメータ伝送

Vue.directive("custom2", {
  挿入(el, バインディング) {
    console.log("バインディング", バインディング);
    if (バインディング && バインディング値) {
      el.innerText = "グローバルカスタム命令をテストします";
      console.log("el", el);
      el.style.position = "絶対";
      el.style.top = "50%";
      const arg = (any としてバインド).arg;
      el.style[arg] = "50%";
      el.style.transform = "translate(-50%,-50%)";
      el.style.padding = "10px";
      el.style.color = "#333";
    }
  },
});


 <div v-custom2:[direction]="true"></div>
 
  プライベート方向 = '左';

5. 拡張

カスタム指示について質問した後、面接官は、通常どのようなデフォルトの指示を使用するかを尋ねました。
私は、 v-for v-if v-show v-modelなどと答えました。次に、v-for と v-if を同時に使用できるかどうかという疑問が生じました。私は、いいえ、同時に使用するとパフォーマンスの問題が生じますと答えました。
Q: パフォーマンスの問題が発生するのはなぜですか?
私はこう答えました: 毎回配列全体を走査する必要がある場合、特に小さな部分だけをレンダリングする必要がある場合は、速度に影響します。
Q: v-for と v-if を一緒に使用しないようにするにはどうすればよいですか?
私:? ? ? このような状況は職場ではあまり遭遇しません。一般的に、v-if はトラバーサル ループ内に置かれます (実際、パフォーマンスの問題は依然として残っています)
インタビュー後、いくつかの情報を調べたところ、 v-forv-if一緒に使用すべきではなく、必要に応じてcomputedプロパティに置き換える必要があることがわかりました。

これで、Vue カスタム手順に関する詳細な記事は終了です。より関連性の高い Vue カスタム手順については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 要素のドラッグを実装するための Vue カスタム命令に関する詳細なコード
  • Vue3のカスタムディレクティブの書き方
  • Vue の 4 つのカスタム命令の説明と使用例
  • vue3 カスタムディレクティブの詳細
  • Vueカスタム命令の詳細な説明
  • vue グローバルカスタム命令とローカルカスタム命令の使用

<<:  URL を入力すると、バックグラウンドでは具体的に何が起こるのでしょうか?

>>:  画像の下部の空白部分の問題を解決する

推薦する

MySQL 8.0 ディクショナリテーブル拡張の詳細な説明

MySQL のデータ ディクショナリは、データベースの重要なコンポーネントの 1 つです。INFOR...

純粋な CSS でマークダウンの自動番号付けを実装するサンプル コード

問題の起源私がタイトルの番号付けの問題に初めて注目したのは、学部の論文を書いていた頃まで遡ります。当...

Div はフラッシュを覆います。フラッシュ透過方式により、フラッシュ上に DIV レイヤーを配置できます。

2つのタイプがあります: (異なるブラウザ) 1. IEブラウザで利用可能コードをコピーコードは次の...

CSS は Google マテリアル デザインのテキスト入力ボックス スタイルを実装します (推奨)

みなさんこんにちは。今日は、純粋な CSS を使用して Google マテリアル デザインのテキスト...

nginx ログを elasticsearch にインポートする方法の例

nginx ログは filebeat によって収集され、logstash に渡され、logstash...

サーバー上で Nginx を使用して Springboot プロジェクトをデプロイする方法の詳細なチュートリアル (jar パッケージ)

1. Javaプロジェクトをjarパッケージにパッケージ化するここではMavenツールを使用します...

CSSを使用してすべての子要素を選択する方法の詳細な説明

CSS を使用してすべての子要素を再帰的に選択するにはどうすればよいですか?以下の記事では、CSS ...

MySQL 整合性制約の定義と例のチュートリアル

目次整合性制約整合性制約の定義整合性制約の分類主キー制約単一の主キーと複合主キーの違い主キーフィール...

jsは古典的なマインスイーパゲームを実装します

この記事の例では、古典的なマインスイーパゲームを実装するためのjsの具体的なコードを参考までに共有し...

私のCSSアーキテクチャのコンセプト - それは人によって異なり、ベストなものはなく、適切なものだけがある

はじめに<br />私はフロントエンド分野でかなり長い間働いており、CSS分野でも長い間...

HTML+CSS ボックスモデルの例 (円、半円など) 「border-radius」はシンプルで使いやすい

多くの友人は、フロントエンドを学習するときに、ボックス モデルがデフォルトで正方形であることに気付き...

Linuxのtopコマンド出力の詳細な説明

序文皆さんは Linux で top コマンドを使ったことがあると思います。私は Linux に触れ...

Mysql 複数データベースのバックアップ コード例

この記事は主にMysqlの複数データベースのバックアップのコード例を紹介します。この記事ではサンプル...

MySQLトランザクションとSpring分離レベルの実装原理の詳細な説明

1. トランザクションはACID特性を持つ原子性: トランザクションは、トランザクションによって分割...

データ構造 - ツリー (III): 多方向検索ツリー B ツリー、B+ ツリー

多方向探索ツリー完全二分木の高さ: O(log2N)、ここで2は対数完全なM方向探索木の高さ: O(...