Vue.jsは、リアクティブなユーザーインターフェースを構築するために広く使用されているJavaScriptフレームワークです。その中で、ref
という特別なプロパティは、コンポーネント内のDOM要素や子コンポーネントへの参照を取得するために非常に役立ちます。この記事では、Vue.jsでのref
の使用方法を詳しく解説します。
1. ref
の基本概念
ref
は、Vue.jsでDOM要素や子コンポーネントに直接アクセスするために使用される特別な属性です。通常、Vueのデータバインディングやメソッドを利用して操作しますが、ref
を使うことで、特定のDOM要素やコンポーネントのインスタンスを簡単に取得できます。

例えば、フォームの入力フィールドにアクセスしたい場合、ref
を使ってそのフィールドを参照することができます。これにより、直接的にその要素に対する操作が可能になります。
2. ref
の使用方法
2.1 DOM要素にref
を設定する
ref
は、DOM要素やコンポーネントに対して指定できます。以下の例では、input
タグにref
を設定し、その参照を取得します。
vue
この例では、input
タグにref="myInput"
を設定しています。this.$refs.myInput
を使用して、その入力要素にアクセスし、ボタンをクリックしたときにその要素にフォーカスを当てることができます。
2.2 子コンポーネントにref
を設定する
ref
は、子コンポーネントにも設定できます。これにより、親コンポーネントから子コンポーネントのメソッドやデータにアクセスできます。
vue
子コンポーネントChildComponent
にref="childComp"
を設定し、親コンポーネントでthis.$refs.childComp
を使って、子コンポーネントのメソッドやデータにアクセスします。
3. ref
の使い所
ref
を使う場面としては、以下のようなケースがあります。
- フォームの操作: フォームの入力フィールドにアクセスして、バリデーションを行ったり、値を取得・設定する場合。
- カスタムメソッドの呼び出し: 子コンポーネントに定義されたメソッドを親コンポーネントから呼び出す場合。
- DOMの操作: Vueのデータバインディングで解決できない場合、直接DOMを操作する必要がある場合。
4. ref
の制約
ref
にはいくつかの制約があります。
- リアクティブではない:
ref
で取得した参照はリアクティブではないため、ref
が変更されてもUIは更新されません。ref
を使う主な目的は、DOM操作やインスタンスメソッドへのアクセスです。 - テンプレート内での使用制限:
ref
はコンポーネント内のテンプレートでしか使用できません。$refs
を使用して、コンポーネントやDOM要素にアクセスすることができますが、通常はcreated
やmounted
などのライフサイクルフック内でアクセスします。
5. 複数のref
を使う
Vue.jsでは、複数のDOM要素に同じref
を使うこともできます。その場合、$refs
は配列として参照を返します。例えば、複数のinput
フィールドにアクセスする場合です。
vue
この場合、this.$refs.inputField
は、input
要素の配列を返します。forEach
メソッドを使って、すべてのinput
要素にアクセスし、フォーカスを当てることができます。
6. ref
を使ったVue.jsの応用例
ref
は、Vue.jsのアプリケーションでさまざまな場面で利用できます。例えば、動的に要素を追加したり、アニメーションを制御したりする場合などです。
6.1 動的要素の操作
vue
This is a dynamic element
この例では、div
要素のtextContent
を変更するためにref
を使用しています。
6.2 アニメーションの制御
ref
はアニメーションの制御にも使用できます。以下のように、ref
を使って、アニメーションのターゲット要素にアクセスし、動的にアニメーションを開始できます。
vue
このコードでは、box
というdiv
要素にref
を設定し、ボタンをクリックすることで、その要素をアニメーションさせています。
7. まとめ
Vue.jsのref
は、DOM要素や子コンポーネントへの参照を取得するための強力なツールです。リアクティブなデータバインディングが必要ない場合や、特定のDOM要素やコンポーネントメソッドにアクセスしたい場合に非常に便利です。ref
を使うことで、Vueのデータ駆動型のアプローチに加えて、より柔軟で詳細な制御が可能になります。
ref
を適切に活用することで、より効率的なVue.jsアプリケーションの開発が可能となり、UIの操作やコンポーネント間の相互作用をスムーズに行うことができます。