目次
解決不可能な「動的マウント」
動的マウントを正式に有効にする
ホームページ ウェブフロントエンド Vue.js 解決できない「動的マウント」の問題をVueを使って解決してみよう

解決できない「動的マウント」の問題をVueを使って解決してみよう

Sep 02, 2022 pm 08:30 PM
vue vue3

解決できない「動的マウント」の問題をVueを使って解決してみよう

一部の特殊なシナリオでは、コンポーネントを使用するタイミングが決定できない、または使用したいコンポーネントが Vue のテンプレート内で決定できない場合があります。この場合、コンポーネントを動的にマウントするか、ランタイム コンパイルを使用してコンポーネントを動的に作成してマウントする必要があります。

今日は、実際のプロジェクトから始めて、実際に顧客の問題を解決するときにコンポーネントを動的にマウントする方法を確認し、動的マウントの問題を解決する完全なプロセスを示します。

解決不可能な「動的マウント」

スプレッドシート コントロール SpreadJS が実行されているとき、次のような関数があります。セルをクリックすると、セルの内容を編集するための入力ボックスが表示されます。ユーザーは、カスタム セル タイプの仕様に従って入力ボックスのフォームをカスタマイズし、必要に応じてフォーム フォーム入力タイプを統合できます。

この入力ボックスの作成と破棄は、セル タイプの対応するメソッドを継承することによって実現されます。そのため、ここで問題が発生します。この動的作成メソッドは、VUE テンプレートで単純に構成して直接使用することはできません。 [関連する推奨事項: vuejs ビデオ チュートリアル ]

少し前に、お客様から次のような質問がありました。コントロールのカスタム セルは次のような Vue コンポーネントをサポートしていますか? ElementUIのオートコンプリート?

前述の問題のため:

# 長い間考えた後、私はお客様に真剣に答えました。「コンポーネントの運用ライフサイクルは、一貫性がないので使用できません」と言いましたが、彼は再び話題を変え、この問題は汎用コンポーネントを使用して解決できると言いました。

問題は正常に解決されました。

しかし、このどうしようもない「使えない」が、最近では真夜中の夢の中でも越えられないハードルにもなっている。

その後、ある日 Vue のドキュメントを見ていたら、App は実行中に #app にマウントされているのではないかと思いました。理論的には、他のコンポーネントも必要な Dom に動的にマウントできるはずなので、作成タイミングの問題は解決されます。

動的マウントを正式に有効にする

ドキュメントの表示を続けましょうグローバル APIVue.extend(options) は extend によって作成されます。 Vue インスタンスは、$mount メソッドを使用して DOM 要素に直接マウントできます。これはまさに必要なことです。

<div id="mount-point"></div>
 
// 创建构造器
var Profile = Vue.extend({
  template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
  data: function () {
    return {
      firstName: 'Walter',
      lastName: 'White',
      alias: 'Heisenberg'
    }
  }
})
// 创建 Profile 实例,并挂载到一个元素上。
new Profile().$mount('#mount-point')
ログイン後にコピー

SpreadJS カスタム セルの例に従って AutoCompleteCellType を作成し、セルに設定します。

function AutoComplateCellType() {
}
AutoComplateCellType.prototype = new GC.Spread.Sheets.CellTypes.Base();
AutoComplateCellType.prototype.createEditorElement = function (context, cellWrapperElement) {
//   cellWrapperElement.setAttribute("gcUIElement", "gcEditingInput");
  cellWrapperElement.style.overflow = 'visible'
  let editorContext = document.createElement("div")
  editorContext.setAttribute("gcUIElement", "gcEditingInput");
  let editor = document.createElement("div");
  // 自定义单元格中editorContext作为容器,需要在创建一个child用于挂载,不能直接挂载到editorContext上
  editorContext.appendChild(editor);
  return editorContext;
}
AutoComplateCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) {
    let width = cellRect.width > 180 ? cellRect.width : 180;
    if (editorContext) {
      // 创建构造器
      var Profile = Vue.extend({
        template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
        data: function () {
          return {
            firstName: 'Walter',
            lastName: 'White',
            alias: 'Heisenberg'
          }
        }
      })
      // 创建 Profile 实例,并挂载到一个元素上。
      new Profile().$mount(editorContext.firstChild);
    }
};
ログイン後にコピー

実行し、ダブルクリックして編集状態に入りますが、エラーが見つかりました

[Vue 警告]: テンプレート コンパイラが利用できない Vue のランタイム専用ビルドを使用しています。テンプレートをレンダリング関数にプリコンパイルするか、コンパイラに含まれるビルドを使用してください。

#エラー メッセージによると、現時点では 2 つの解決策があります。

  • runtimeCompiler をオンにし、runtimeCompiler: true 構成を vue.config.js に追加し、ランタイム コンパイルを許可します。 , そのため、動的コンポーネントのニーズを満たすためにテンプレートを動的に生成できます

  • # テンプレートを事前にコンパイルすることは動的にのみマウントされます。オートコンプリート コンポーネントは決定されます。この方法を使用できます
  • コンパイルされたコンポーネントをマウントできるように、動的マウント用に新しい AutoComplete.vue コンポーネントを作成します。
<template>
  <div>
    <p>{{ firstName }} {{ lastName }} aka {{ alias }}</p>
  </div>
</template>
<script>
export default {
  data: function () {
    return {
      firstName: "Walter",
      lastName: "White",
      alias: "Heisenberg",
    };
  },
};
</script>
 
 
import AutoComplate from './AutoComplate.vue'
 
 
AutoComplateCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) {
    let width = cellRect.width > 180 ? cellRect.width : 180;
    if (editorContext) {
      // 创建构造器
      var Profile = Vue.extend(AutoComplate);
      // 创建 Profile 实例,并挂载到一个元素上。
      new Profile().$mount(editorContext.firstChild);
    }
};
ログイン後にコピー

ダブルクリックして編集状態に入り、コンポーネントの内容を確認します

次のステップでは、カスタム セルについても、次の設定を行う必要があります。コンポーネントContentの編集を取得し、コンポーネントにpropsを追加すると同時に、マウント時に作成されるVueComponentインスタンス上のすべてのpropsコンテンツを直接取得することで、対応する操作でデータ取得設定を実現できます。

AutoComplate.vue を更新し、プロパティを追加し、編集用の入力を追加します。

<template>
  <div>
    <p>{{ firstName }} {{ lastName }} aka {{ alias }}</p>
    <input type="text" v-model="value">
  </div>
</template>
<script>
export default {
  props:["value"],
  data: function () {
    return {
      firstName: "Walter",
      lastName: "White",
      alias: "Heisenberg",
    };
  },
};
</script>
ログイン後にコピー

this.vm を通じて VueComponent インスタンスを保存し、getEditorValue メソッドと setEditorValue メソッドで VUE コンポーネントの Value を取得して設定します。 。編集後、$destroy() メソッドを呼び出して、動的に作成されたコンポーネントを破棄します。

AutoComplateCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) {
    let width = cellRect.width > 180 ? cellRect.width : 180;
    if (editorContext) {
      // 创建构造器
      var Profile = Vue.extend(MyInput);
      // 创建 Profile 实例,并挂载到一个元素上。
      this.vm = new Profile().$mount(editorContext.firstChild);
    }
};
 
AutoComplateCellType.prototype.getEditorValue = function (editorContext) {
    // 设置组件默认值
    if (this.vm) {
        return this.vm.value;
    }
};
AutoComplateCellType.prototype.setEditorValue = function (editorContext, value) {
    // 获取组件编辑后的值
    if (editorContext) {
      this.vm.value = value;
    }
};
AutoComplateCellType.prototype.deactivateEditor = function (editorContext, context) {
    // 销毁组件
    this.vm.$destroy();
    this.vm = undefined;
};
ログイン後にコピー

プロセス全体が実行されました。必要なのは、AutoComplate.vue で入力を ElementUI の el-autocomplete に置き換え、対応するメソッドを実装することだけです。

結果

効果を見てみましょう。

実際、動的マウントは複雑な操作ではありません。Vue の例を理解した後、vm を介してインスタンスを操作し、動的マウントやランタイム コンパイルされたコンポーネントを柔軟に使用することは難しくありません。

実は、すべての解決策は Vue チュートリアルの入門チュートリアルに記載されていますが、スキャフォールディングを使用したり、さまざまなツールを使用したりすることで、Vue の本来の目的が忘れられ、単純な問題がかえって複雑になってしまいます。

今日の共有はここで終了します。今後はさらに本格的で興味深いコンテンツをお届けします~

プログラミング関連の知識をさらに詳しく知りたい場合は、次のサイトをご覧ください: プログラミング入門! !

以上が解決できない「動的マウント」の問題をVueを使って解決してみようの詳細内容です。詳細については、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)

VUEのボタンに関数を追加する方法 VUEのボタンに関数を追加する方法 Apr 08, 2025 am 08:51 AM

HTMLテンプレートのボタンをメソッドにバインドすることにより、VUEボタンに関数を追加できます。 VUEインスタンスでメソッドを定義し、関数ロジックを書き込みます。

vue.jsでJSファイルを参照する方法 vue.jsでJSファイルを参照する方法 Apr 07, 2025 pm 11:27 PM

vue.jsでJSファイルを参照するには3つの方法があります。タグ;; mounted()ライフサイクルフックを使用した動的インポート。 Vuex State Management Libraryを介してインポートします。

VueでBootstrapの使用方法 VueでBootstrapの使用方法 Apr 07, 2025 pm 11:33 PM

vue.jsでBootstrapを使用すると、5つのステップに分かれています。ブートストラップをインストールします。 main.jsにブートストラップをインポートしますブートストラップコンポーネントをテンプレートで直接使用します。オプション:カスタムスタイル。オプション:プラグインを使用します。

VueでWatchの使用方法 VueでWatchの使用方法 Apr 07, 2025 pm 11:36 PM

Vue.jsの監視オプションにより、開発者は特定のデータの変更をリッスンできます。データが変更されたら、Watchはコールバック関数をトリガーして更新ビューまたはその他のタスクを実行します。その構成オプションには、すぐにコールバックを実行するかどうかを指定する即時と、オブジェクトまたは配列の変更を再帰的に聴くかどうかを指定するDEEPが含まれます。

Vueによる前のページに戻る方法 Vueによる前のページに戻る方法 Apr 07, 2025 pm 11:30 PM

vue.jsには、前のページに戻る4つの方法があります。$ router.go(-1)$ router.back()outes&lt; router-link to =&quot;/&quot; Component Window.history.back()、およびメソッド選択はシーンに依存します。

Vueはマーキー/テキストスクロール効果を実現します Vueはマーキー/テキストスクロール効果を実現します Apr 07, 2025 pm 10:51 PM

CSSアニメーションまたはサードパーティライブラリを使用して、VUEでマーキー/テキストスクロール効果を実装します。この記事では、CSSアニメーションの使用方法を紹介します。スクロールテキストを作成し、テキストを&lt; div&gt;をラップします。 CSSアニメーションを定義し、オーバーフローを設定します:非表示、幅、アニメーション。キーフレームを定義し、アニメーションの開始と終了時にtranslatex()を設定します。期間、スクロール速度、方向などのアニメーションプロパティを調整します。

Vueのバージョンを照会する方法 Vueのバージョンを照会する方法 Apr 07, 2025 pm 11:24 PM

Vue Devtoolsを使用してブラウザのコンソールでVueタブを表示することにより、Vueバージョンを照会できます。 NPMを使用して、「NPM List -G Vue」コマンドを実行します。 package.jsonファイルの「依存関係」オブジェクトでVueアイテムを見つけます。 Vue CLIプロジェクトの場合、「Vue -Version」コマンドを実行します。 &lt; script&gt;でバージョン情報を確認してくださいVueファイルを参照するHTMLファイルにタグを付けます。

VUEトラバーサルの使用方法 VUEトラバーサルの使用方法 Apr 07, 2025 pm 11:48 PM

Vue.jsには配列とオブジェクトを通過するには3つの一般的な方法があります。V-Forディレクティブは、各要素をトラバースしてテンプレートをレンダリングするために使用されます。 V-BindディレクティブをV-Forで使用して、各要素の属性値を動的に設定できます。 .mapメソッドは、配列要素を新しい配列に変換できます。

See all articles