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 の新機能は何ですか?

推薦する

仮想マシンに Windows Server 2008 オペレーティング システムをインストールする

この記事では、Windows Server オペレーティング システムのインストールと企業でのそのア...

MySQLdump コマンドを使用した MySQL データの移行

このソリューションの利点はシンプルさと使いやすさですが、欠点はダウンタイムが長くなることです。 した...

Vue プロジェクトを使用して複数のプロキシを構成する際の注意事項

Vue プロジェクトの開発プロセスでは、ローカル デバッグの利便性のため、通常、vue.config...

Ubuntu 20.04 デスクトップのインストールとルート権限の有効化および SSH インストールの詳細

記事は主にUbuntu 20.04の簡単なインストールプロセスを記録し、インストール後に国内ソースを...

LinuxベースのSelenium環境を構成し、操作を実装する

1. Linux で Selenium を使用する1. Chromeをインストールする次のコマンドを...

Linux CentOS 6.5 ifconfig が IP を照会できない問題の解決方法

最近、何人かの友人から、仮想マシンに CentOS をインストールした後、ifconfig コマンド...

MySQL空間関数を使用してロケーションパンチインを実装するための完全な手順

序文プロジェクトの要件は、ユーザーの現在の位置が特定の地理的位置範囲内にあるかどうかを判断することで...

Docker イメージのエクスポート、インポート、コピーの例の分析

最初の解決策は、イメージを公開イメージリポジトリにプッシュし、それをプルダウンすることです。 2 番...

Vue の状態管理: Vuex の代わりに Pinia を使用する

目次1. ピニアとは何ですか? 2. Piniaは使いやすい3. ユーザーエクスペリエンス1. ピニ...

Viteプロジェクトを作成する手順

目次序文yarn create は何をしますか?ソースコード分析プロジェクトの依存関係テンプレート構...

MySQLテクノロジーにおけるInnoDBロックの詳細な説明

目次序文1. ロックとは何ですか? 2. InnoDBストレージエンジンのロック2.1 ロックの種類...

デザインリファレンス 美しく独創的なブログデザイン

以下にリストされているすべてのブログはオリジナルであり、独自にデザインされています。これらは、他者が...

MySQL での find_in_set() 関数の使用に関する詳細な説明

まず、例を見てみましょう。記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホッ...

nginx パニック問題の解決方法の詳細な説明

nginx パニック問題に関しては、まず nginx の起動プロセス中に、マスター プロセスが構成フ...

純粋な CSS3 で蝶が羽ばたく様子を再現する例

純粋なCSS3で蝶が羽ばたく様子を再現。まずはその効果をご覧ください どうですか?効果はかなりいいで...