DOM操作は基本的なものです。
OptionsAPIで書かれている記事やドキュメントがあるのですが、compositionAPIで書かれている記事があまりなかったので、compositionAPIでDOM操作行いたいという人はこの記事で実装に生かすことができます!
結論「テンプレート参照“Ref”を使う!」
取得したいDOMにrefを付ける必要があります。
そのためにRefをvueからインポートし、使えるようにします。
ただ、ここでライフルサイクルフックを考慮する必要があります。
DOM取得はレンダリングされた後(mounted)に取るものなので、Vueファイルを読み込んだとき(created)に取ることはできません。
なので、mountedをsetup内で使うときのフック「onMounted」を使ってDOM取得をします。
今の簡単な流れをもう少し砕いてみてみましょう。
Refを使えるようにする
①Refを使うためにimportしていきます。
②DOM取得したい場所にref属性を追加します。
<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メソッド」というものがあります。
ここの記事が参考になったので見てみてください。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9VnVlMyUyMCVFMyU4MSVBRSUyMG5leHRUaWNrJTIwJUUzJTgxJUFGJUU0JUJEJTk1JUUzJTgxJThCJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1hOGZkMzE5MzJjOTRmNDg5ZmM1Mjk1MTU3ZDhlM2M4NQ&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwZG96MTMxODkmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTA2MjZiMWE1NDI0YTk4N2JiMDFmNDkxYWI3MTFhZTE1&blend-x=142&blend-y=491&blend-mode=normal&s=6dba90ef585721a42f932eeec1f71cd5)