【Vue.js】refとreactiveを使ってリアクティブな変数を作成する方法を解説します。

Vue.js Web制作

【Vue.js】refとreactiveを使ってリアクティブな変数を作成する方法を解説します。

なやむくん
Vue.jsでリアクティブな値とはどういうことでしょうか。

なやむさん
refとreactiveの違いと使い方について知りたい。

などの疑問や悩みを解決してまいります。

この記事ではVue.jsでrefreactiveを使ってみてリアクティブな変数を作成し、2つの違いについて理解することができます。

初心者向けの記事となっていますので予めご了承ください。

リアクティブな値とは何か

リアクティブな値は、その値の変更がされるとそれに応じて他の部分も自動的に更新されるという特徴を持っています。

例えばフォームに入力した内容を別の箇所にも同時に反映するといったことも可能になります。

よろこびくん
すごい便利そうな機能ですね!

値をリアクティブにするためにはrefreactiveを使用します。

どのような違いがあるのか、そして使い方について参考例を交えて解説していきたいと思います。

refを使ったパターン

まずはrefを使ったパターンから解説していきます。

refref関数を使用して、単一な値をリアクティブにすることができます。

単一とはつまり配列やオブジェクトではない値をリアクティブにしたい場合にref関数を使用するということになります。

実際に使用例を紹介します。

今回2つのVueファイルを用意しました。ページに表示するApp.vueとコンポーネントファイルのLearnVue.vueです。

<script setup>
  import LearnVue from './components/LearnVue.vue';
</script>

<template>
  <LearnVue /> 
</template>

<style scoped></style>
みつた
App.vueは単純にLearnVue.vueをコンポーネントで呼び出しているだけなので解説は割愛します。
<script setup>
  import { ref } from 'vue';
  const inputValue = ref('')
  const input = (e) => {
    inputValue.value = e.target.value
  }
</script>

<template>
  <input @input="input" type="text">
  <label>入力した内容:{{ inputValue }}</label>
</template>

<style scoped></style>

ハイライトしているコードがrefに関係する部分になります。

このコードでページを確認すると以下のような実装が可能になります。

それではコードの説明していきます。

ref関数をインポートする

それではscriptタグの中から見ていきます。

<script setup>
  import { ref } from 'vue';
  const inputValue = ref('')
  const input = (e) => {
    inputValue.value = e.target.value
  }
</script>

まずref関数を使用するためにはimport { ref } from 'vue';のコードが必要になります。

このコードはComposition APIから ref 関数をインポートしている部分になります。

なのでrefを使って単一な値をリアクティブにしたい場合は、まずこの記述からといった感じです。

リアクティブな値にしたい内容をラップする

今回の例ではconst inputValue = ref('')と記述しています。

これは定数inputValueの値をref関数でラップしてリアクティブな値としています。

関数の引数に入れていると解釈されてしまいがちですが、ref関数はラップされたデータを返すのではなく、その格納されたデータをオブジェクトとして値を返します。

みつた
そのためref関数の()内に入れた値をラップすると説明しています。

どのようなオブジェクトで返ってくるかは後ほど説明します。

ref関数でラップした値にアクセスする場合

次に着目していただきたいのがinput関数の処理内容です。

input関数はフォームに入力があったらinputValue.value = e.target.valueこのコードの処理をするように記述しています。

左から見ていきます。

inputValue.valueというのは結論から言うとinputValueの値にアクセスすることです。

ref関数はラップされたデータを返すのではなく、その格納されたデータをオブジェクトとして値を返すということを前の題で説明しました。

オブジェクトの値にアクセスするために.valueを使っているということです。

今回のref関数によって返ってくる値は以下のようになります。

{ value: '入力された文字列' }
もえるくん
オブジェクトが返ってくるなんて思いませんでした!だから.valueでアクセスしているんですね!

これにより、inputValue.valueでアクセスして、値を代入しているということになります。

入力した値を取得

次に右側のコードを見ていきます。

e.target.valueは入力した値を取得します。

まずeeventの略でイベントオブジェクトです。

.targetはそのイベントオブジェクトの数あるプロパティの1つでありイベントが発生した要素を取得します。

ここでe.targetconsole.logで出力すると以下の値が返ってきます。

  <input type="text">
みつた
inputイベントが発生した要素を取得できていますね。

.valueフォーム要素から値を取得するためのプロパティです。

なのでe.target.valueイベントが発生したフォーム要素(inputタグ)の入力した内容を取得するというコードになります。

inputイベントで関数の処理を発生、値をマスタッシュ構文へ

scriptタグ内の解説が終了したということでtemplateタグ内を見ていきます。

<input @input="input" type="text">はv-onディレクティブでinputを指定しています。

これでフォームに入力されたらイベントが発火するようになっています。

発火したときに走る処理がinput関数です。

input関数は入力した値を定数inputValueに代入していましたね。

その代入された定数inputValueの内容をマスタッシュ構文でページに表示されるようにしています。

リアクティブな値はその値が変更されるごとにDOMを再構築します。

なので今回の場合はフォームに1文字追加されるごと関数の処理が走りリアクティブな値が更新されます。

更新されるごとにDOMが再構築されてマスタッシュ構文内の内容も更新されていくという仕組みになっています。

reactiveを使ったパターン

次にreactiveを使ってリアクティブな値を作っていきます。

reactivereactive関数を使用してオブジェクト全体をリアクティブな値とします。

reactiveを使用したコード例を以下に準備しています。

<script setup>
  import { reactive } from 'vue';
  const profile = reactive({
    name: '',
    age: 0
  })
  const inputName = (e) => {
    profile.name = e.target.value
  }
  const inputAge = (e) => {
    profile.age = e.target.value
  }
</script>

<template>
  <input @input="inputName" type="text" placeholder="名前の入力"><br>
  <label>名前:{{ profile.name }}</label><br>
  <input @input="inputAge" type="number" placeholder="年齢の入力"><br>
  <label>年齢:{{ profile.age }}</label>
</template>

<style scoped></style>
みつた
App.vueは変わらないので省略します。

今回は名前の入力欄に文字列を入力すると名前:の箇所に入力した内容が表示されます。

また年齢の入力欄に数字を入力すると年齢:の箇所に入力した数値が表示されます。

ページには以下のように表示されます。

それではコードの説明していきます。

reactive関数をインポートする

<script setup>
  import { reactive } from 'vue';
  const profile = reactive({
    name: '',
    age: 0
  })
  const inputName = (e) => {
    profile.name = e.target.value
  }
  const inputAge = (e) => {
    profile.age = e.target.value
  }
</script>

まずreactive関数を使用するためには、ref関数同様import { reactive } from 'vue';のコードが必要になります。

reactive関数もrefと同様にComposition APIから インポートしてくる必要があります。

なのでオブジェクトをリアクティブな値としたい場合はこのコードを最初に記述しておきましょう。

reactive関数でオブジェクトをラップする

こちらもref関数同様にリアクティブな値としたいオブジェクトをラップします。

  const profile = reactive({
    name: '',
    age: 0
  })

値にアクセスする場合は、通常のオブジェクトと同様にnameの値にアクセスする場合はprofile.name、ageの値にアクセスする場合はprofile.ageとします。

みつた
残りの処理はref関数と同じなので解説は割愛します。どのような動きかを確認する場合は、再度ref関数の解説を確認ください。
  • この記事を書いた人
  • 最新記事

みつた

完全未経験&異業種から30歳の年でIT企業に転職。

Web系開発言語が好き。
どちらかというとバックエンドよりもフロントエンドが好き(現時点では…)

最近はサウナと観葉植物にハマっている。
野球が好きで一応投手。

-Vue.js, Web制作