Vueインスタンスで$refsを使用する際の注意点

Vueインスタンスで$refsを使用する際の注意点

開発の過程では、インスタンスの vm.$refs(this.$refs) を使用して、ref で登録されたコンポーネントを取得し、対応する操作を実行することがよくあります。しかし、要素が取得できない場合があります。根本的な原因は、$refs はマウント (レンダリング) された後でのみ要素を取得できることです。

たとえば、この場合、フラグが true 値から false 値に切り替わるとノードを取得できないのは正常です。v-if が false 値の場合、ノードはレンダリングされないためです。

ただし、false 値から true 値に切り替えると、ノードを取得できなくなる可能性があります。これはレンダリングに時間がかかるためです。これは通常、$nextTick() を使用して解決できます。

...
<el-table v-if="フラグ" ref="テーブル">
  <el-table-column prop="prop1"></el-table-column>
  <el-table-column prop="prop2"></el-table-column>
</el-table>
...
 
 
エクスポートデフォルト{
  メソッド: {
    this.$refs.table.XXX()
  }
}

しかし、非常に特殊なケースがあります。ページが初めてレンダリングされるとき、$refs は値を取得できません。このとき、コンポーネント要素を非表示にしたり表示したりするには、v-show を考慮する必要があります。

v-show は CSS display:none によって非表示になっているため、最初にレンダリングされ、要素が確実に取得されます。

補足: Vue.js で ref ($refs) を使用する例とヒント

1. 公式文書による使用法の要約:

Vue.js ドキュメントの ref セクションを参考に、後で参照できるように ref の使い方をまとめました。

1. refは外部コンポーネントで使用される

HTML部分

<div id="ref-outside-component" v-on:click="consoleRef">
  <コンポーネントの親 ref="outsideComponentRef">
  </コンポーネントの父>
  <p>ref は外側のコンポーネントにあります</p>
</div>

js部分

var refoutsidecomponentTem = {
    テンプレート:"<div class='childComp'><h5>私は子コンポーネントです</h5></div>"
  };
  var refoutsidecomponent = 新しいVue({
    el:"#ref-outside-component",
    コンポーネント:{
      "コンポーネントの父":refoutsidecomponentTem
    },
    方法:{
      コンソールRef:関数() {
        console.log(this); // #ref-outside-component vue インスタンス console.log(this.$refs.outsideComponentRef); // div.childComp vue インスタンス }
    }
  });

2. Refは外部要素に使用されます

HTML部分

<!--ref は外側の要素にあります -->
<div id="ref-outside-dom" v-on:click="consoleRef" >
  <コンポーネントの父>
  </コンポーネントの父>
  <p ref="outsideDomRef">ref は外側の要素にあります</p>
</div>

JS部分

var refoutsidedomTem = {
    テンプレート:"<div class='childComp'><h5>私は子コンポーネントです</h5></div>"
  };
  var refoutsidedom = 新しい Vue({
    el:"#ref-outside-dom",
    コンポーネント:{
      "コンポーネントの父":refoutsidedomTem
    },
    方法:{
      コンソールRef:関数() {
        console.log(this); // #ref-outside-dom vue の例 console.log(this.$refs.outsideDomRef); // <p> ref は外側の要素にあります</p>
      }
    }
  });

3. Refは内部の要素に使用されます --- ローカル登録コンポーネント

HTML部分

<!-- 内部の要素を参照 -->
<div id="ref-inside-dom">
  <コンポーネントの父>
  </コンポーネントの父>
  <p>ref は要素内にあります</p>
</div>

JS部分

  var refinsidedomTem = {
    テンプレート:"<div class='childComp' v-on:click='consoleRef'>" +
            「<h5 ref='insideDomRef'>私は子コンポーネントです</h5>」 +
         "</div>",
    方法:{
      コンソールRef:関数() {
        console.log(this); // div.childComp vue インスタンス console.log(this.$refs.insideDomRef); // <h5 >私は子コンポーネントです</h5>
      }
    }
  };
  var refinsidedom = new Vue({
    el:"#ref-inside-dom",
    コンポーネント:{
      "コンポーネントの父":refinsidedomTem
    }
  });

4. Refは内部の要素に使用されます --- グローバル登録コンポーネント

HTML部分

<!-- 要素内の参照 -- グローバル登録 -->
<div id="ref-inside-dom-all">
  <ref-inside-dom-quanjv></ref-inside-dom-quanjv>
</div>

JS部分

  Vue.component("ref-inside-dom-quanjv",{
    テンプレート:"<div class='insideFather'> " +
          "<input type='text' ref='insideDomRefAll' v-on:input='showinsideDomRef'>" +
          " <p>内部の要素の参照 - グローバルに登録</p> " +
         "</div>",
    方法:{
      showinsideDomRef:function() {
        console.log(this); //これは実際にはdiv.insideFatherです
        console.log(this.$refs.insideDomRefAll); // <input type="text">
      }
    }
  });
  var refinsidedomall = new Vue({
    el:"#ref-inside-dom-all"
  });

2. 気をつけるべき落とし穴

1. v-for トラバーサルを通じて異なる参照を追加する場合は、: 記号を追加することを忘れないでください。つまり、:ref = 変数です。

これは他の属性と同じです。固定値の場合は、: 記号を追加する必要はありません。変数の場合は、: 記号を追加することを忘れないでください。

2. :ref = 変数でrefを追加します(つまり:を追加します)。refを取得したい場合は、this.$refs[refsArrayItem] [0]のように[0]を追加する必要があります。:ref = 変数ではなくref = 文字列の場合は、this.$refs[refsArrayItem]のように追加する必要はありません。

追加する場合と追加しない場合の違い [0] - 展開されていない

追加することと追加しないことの違い [0] - 拡大

3. 要素 UI ダイアログボックスが開いた後に DOM を取得する場合は、this.$refs を直接使用するのではなく、$nextTick を使用する必要があります。imgLocal2:

    console.log('this.$refs.imgLocal2 の外側', this.$refs.imgLocal2);
    タイムアウトを設定する(() => {
     console.log('this.$refs.imgLocal2 setTimeout', this.$refs.imgLocal2);
    }, 500); // 推奨されません this.$nextTick(() => {
     console.log('this.$refs.imgLocal2 $nextTick', this.$refs.imgLocal2);
    });

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Vue親コンポーネントは$refsを通じて子コンポーネントの値とメソッドを取得します。
  • Vueは基本的に--refsを使用してコンポーネントまたは要素のインスタンスを取得します
  • Vueはこれを通じてDOMまたはコンポーネントエラーの問題を解決します。$refs
  • Vueはネストされたコンポーネント内の値を取得するためにrefを使用します

<<:  携帯電話番号の真ん中の4桁を隠すMySQL SQL文の方法

>>:  2018 年にリリースされる Apache Spark 2.4 の新機能は何ですか?

推薦する

MySQL 同期遅延が発生したときに Seconds_Behind_Master が 0 のままになる理由

目次問題の説明原理分析問題分析拡大する総括する問題の説明ユーザーはプライマリ データベースに対して変...

MySQL で大文字と小文字を区別しないように設定する方法

mysql は大文字と小文字を区別しないように設定されていますウィンドウズmysqlがインストールさ...

MySQLのunion allとunionの違いを簡単に理解する

Union は、重複行を除外し、デフォルトのソートを実行する、データに対する結合操作です。Union...

MySQL実行計画の詳細な分析

序文前回の面接では、実行計画について質問されたとき、多くの人がそれが何なのか知りませんでした。実行計...

Vueカスケードドロップダウンボックスの設計と実装

目次1. データベース設計2. フロントエンドページ3. 完全なデモフロントエンド開発では、カスケー...

MySQL で指定した桁数の乱数を生成する方法と、バッチで乱数を生成する方法

1. まず、よく使われるMySQL関数をいくつか紹介しますRAND() は 0 から 1 (0<...

DockerにMySQLをインストールする方法

最近 Django を導入しましたが、MySQL を手動でインストールしたくなかったので、Docke...

MySQL での実行計画の詳細分析

序文効率的なSQL文の書き方は、Explain実行計画の分析と切り離せません。実行計画とは何か、効率...

一般的な JavaScript メモリ エラーと解決策

目次1. タイマー監視2. イベント監視3.オブザーバー4. ウィンドウオブジェクト5. DOM参照...

Q&A: XML と HTML の違い

Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...

スケジュールされた時間に古いジャンクファイルを自動的に削除する Linux 用の Autotrash ツール

Autotrash は、古い削除済みファイルを消去するプロセスを自動化するコマンド ライン プログラ...

VUE 応答性原理の詳細な説明

目次1. 応答原理の基盤2. コアオブジェクト: Dep と Watcher 3. 依存関係を収集し...

テーブルセルの幅tdの設定は無効であり、内部コンテンツによって常に引き伸ばされます

テーブルページを作成するときに、td に設定された幅が無効になることがあります。td の幅は常に内部...

JavaScriptにおける評価戦略の詳細な説明

目次それを覆う栗パラメータの受け渡し値渡し共同配送要約する拡張機能 - 遅延評価私は最近、JavaS...

LinuxにNginxをインストールする正しい手順

序文私のように、Java バックエンドに勤勉な人であれば、多数のプロジェクト機能を実装することに加え...