今日はVue3 の分かったようでわからないref()とreactive()の違いを説明します。
Vue3のref()とは
Vue3のref
は、Vue.jsフレームワークで導入されたリアクティブなデータを扱うための機能です。ref
は、単一の値をラップし、それを監視して変更があった場合に自動的に再レンダリングすることができます。
ref
を使用すると、リアクティブなデータを簡単に作成できます。通常、基本データ型(文字列、数値、真偽値など)をref
でラップします。例えば、以下のようにref
を使用して数値を定義できます。
import { ref } from 'vue'; const count = ref(0);
このコードでは、ref
関数を使ってcount
というリアクティブなデータを定義しています。初期値として0を渡しています。
ref
でラップされたデータを参照する場合は、.value
プロパティを使用します。
console.log(count.value); // 0
データを変更する場合は、単純に新しい値を代入します。Vueは自動的に変更を検出し、再レンダリングをトリガーします。
count.value = 1; console.log(count.value); // 1
ref
は、単一の値だけでなく、オブジェクトや配列などのデータ構造もラップすることができます。ただし、ネストしたプロパティの変更を検出するためには、.value
を明示的に使用する必要があります。
const data = ref({ name: 'John', age: 25 }); console.log(data.value.name); // 'John' data.value.name = 'Jane'; console.log(data.value.name); // 'Jane'
また、ref
はVueコンポーネント内で使用されることが一般的です。リアクティブなデータを使用することで、コンポーネントの状態の変更を監視し、自動的に再レンダリングすることができます。
reactive()とは
Vue3のreactive
は、Vue.jsフレームワークで使用されるリアクティブなオブジェクトを作成するための関数です。reactive
を使用すると、オブジェクトをリアクティブに監視し、そのプロパティの変更を検出して自動的に再レンダリングすることができます。
reactive
を使ってリアクティブなオブジェクトを作成するには、reactive
関数にオブジェクトを渡します。以下はその例です。
import { reactive } from 'vue'; const state = reactive({ count: 0, name: 'John' });
このコードでは、reactive
関数を使ってstate
というリアクティブなオブジェクトを作成しています。state
オブジェクトは、count
とname
という2つのプロパティを持っています。
リアクティブなオブジェクトのプロパティにアクセスするには、通常のJavaScriptオブジェクトのようにドット記法やブラケット記法を使用します。
console.log(state.count); // 0 console.log(state.name); // 'John'
state
オブジェクトのプロパティを変更すると、Vueは変更を検出し、関連するコンポーネントの再レンダリングをトリガーします。
state.count = 1; console.log(state.count); // 1
reactive
を使用すると、ネストされたオブジェクトや配列もリアクティブにすることができます。ただし、ネストされたプロパティにアクセスする場合は、リアクティブオブジェクトの参照を使用する必要があります。
state.nested = reactive({ prop: 'Nested Property' }); console.log(state.nested.prop); // 'Nested Property' state.nested.prop = 'Updated Property'; console.log(state.nested.prop); // 'Updated Property'
reactive
を使用することで、Vueコンポーネント内でリアクティブなデータを簡単に管理できます。プロパティの変更を追跡し、自動的に再レンダリングすることで、アプリケーションの状態を効果的に管理することができます。
refでオブジェクトを格納できるのにわざわざreactiveを使う理由
ref
を使用してオブジェクトを格納することはできますが、reactive
を使う理由はいくつかあります。
- プロパティの自動追跡:
ref
でオブジェクトを格納する場合、オブジェクトのプロパティが変更されると、そのプロパティにアクセスするたびに.value
を明示的に使用する必要があります。一方、reactive
を使用すると、オブジェクト全体がリアクティブになり、プロパティの変更を自動的に検知して再レンダリングをトリガーします。これにより、より直感的にオブジェクトのプロパティを使用できます。 - ネストされたオブジェクトや配列のリアクティブな扱い:
ref
を使用してオブジェクトをラップする場合、ネストされたオブジェクトや配列のプロパティの変更を追跡するために、各プロパティに対して個別にref
を使用する必要があります。一方、reactive
はオブジェクト全体をリアクティブに扱うため、ネストされたオブジェクトや配列の変更も自動的に検知できます。 - コードの簡潔さと可読性:
reactive
を使用すると、オブジェクトを一括でリアクティブに扱えます。プロパティへのアクセスが簡潔になり、.value
を使う必要がないため、コードの可読性が向上します。
ただし、ref
を使用してオブジェクトを格納する場合でも、ユーティリティ関数であるtoRefs
を使用することで、オブジェクトのプロパティをリアクティブに扱うことができます。これにより、ref
とreactive
を組み合わせた使い方が可能になります。
短いコードや単純なデータ構造の場合には、ref
でオブジェクトを格納するだけで十分です。しかし、より複雑なデータ構造やネストされたオブジェクトを扱う場合には、reactive
を使用することでコードの可読性とメンテナンス性が向上するでしょう。
reactive(null)がエラーになる理由
reactive(null)
がエラーになる理由は、reactive
関数はオブジェクトを引数として受け取る必要があるためです。null
はオブジェクトではなく、プリミティブ型の一種です。
reactive
関数は、与えられたオブジェクトをリアクティブにラップし、そのプロパティの変更を検知するために内部的なトラッキング機構を使用します。しかし、null
はオブジェクトではないため、トラッキングするプロパティが存在しないためエラーが発生します。
もし、null
をリアクティブに扱いたい場合は、ref
を使用することが適切です。ref
はプリミティブ型やオブジェクトの両方をラップすることができます。