【Vue3】compositionAPIでDOMを取得する方法

アイデア Web開発

DOM操作は基本的なものです。

OptionsAPIで書かれている記事やドキュメントがあるのですが、compositionAPIで書かれている記事があまりなかったので、compositionAPIでDOM操作行いたいという人はこの記事で実装に生かすことができます!

結論「テンプレート参照“Ref”を使う!」

取得したいDOMにrefを付ける必要があります。

そのためにRefをvueからインポートし、使えるようにします。

ただ、ここでライフルサイクルフックを考慮する必要があります。

https://v3.ja.vuejs.org/guide/composition-api-lifecycle-hooks.html

DOM取得はレンダリングされた後(mounted)に取るものなので、Vueファイルを読み込んだとき(created)に取ることはできません。

なので、mountedをsetup内で使うときのフック「onMounted」を使ってDOM取得をします。

今の簡単な流れをもう少し砕いてみてみましょう。

Refを使えるようにする

①Refを使うためにimportしていきます。

②DOM取得したい場所にref属性を追加します。

https://v3.ja.vuejs.org/guide/reactivity-fundamentals.html#%E7%8B%AC%E7%AB%8B%E3%81%97%E3%81%9F%E3%83%AA%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%95%E3%82%99%E3%81%AA%E5%80%A4%E3%82%92-ref-%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B
<template>
  <div class="test" ref="testRef">test</div> //②
</template>

<script>
import { ref } from "vue"; //①

export default {
  setup() {
    return {
    };
  },
};
</script>

setup関数の中の処理

① 「const testRef = ref(null); 」追加

このrefオブジェクトはcreateのときに読み込まれるものとして設定します。

②DOMを定数で定義する

refオブジェクトは1つプロパティ「value」があり、それを取ることがで、DOMを取得します。

③定数をreturnする

compositionAPIなので、setup関数内でreturnする必要があります。

④onMountedを追加する

DOM取得はレンダリングの後(mounted)に行われるため、その処理(③)をsetupに書いてしまうと、create扱いになってしまいます。mountedで処理するためには、onMountedの中に③の処理を書きましょう。

<template>
  <!-- ref属性の追加 -->
  <div class="test" ref="testRef">test</div>
</template>

<script>
import { ref, onMounted } from "vue";

export default {
  setup() {
    const testRef = ref(null); //1
    onMounted(() => { //4
      const testDom = testRef.value;  //2
      console.log(testDom);
    });
    return {
      testRef, //3
    };
  },
};
</script>

それでもDOMが取れないとき

上の処理を書いたにもかかわらず、DOMが取得できないときは、DOMが更新された後に処理を行う「nextTickメソッド」というものがあります。

ここの記事が参考になったので見てみてください。

Vue3 の nextTick は何か - Qiita
DOM の更新は非同期に行われるVue は 3.x, 2.x に関わらず、非同期に DOM 更新を実行しています。DOM 更新が非同期であることは、以下の例で確認することができます。<!DOC…
タイトルとURLをコピーしました