【Vue.js】オブジェクトのプロパティを追加してもリアクティブに動作しなかった時の備忘録にて、Vue2.x
において、オブジェクトのプロパティを追加してもリアクティブに動作しないこと、またその解決策について書きました。
Vue3
で同じことをしようとすると、どのような挙動になるのか確認してみました。結論を先に言ってしまうと、Vue3
からオブジェクトにプロパティを追加した場合もリアクティブに動作するようになりました。
Vue3環境の準備
vue-cliコマンドを利用してVue3
をインストールしていきます。vue create
コマンドでVue 3 Preview
を選択します。(vue-cliがv4.5以上でないとVue3
環境は作成できません。)
vue create study-vue3
? Please pick a preset: Default (Vue 3 Preview) ([Vue 3] babel, eslint)
(ディレクトリ名はstudy-vue3
としました。)
npm run serve
を実行して以下の画面が確認できれば、インストールは無事に完了しています。
HelloWorldを書き換える
オブジェクトのプロパティがv-if
に指定されるようHelloWorld.vue
を以下に書き換えます。
<template>
<div>
<button @click="show">表示する</button>
<p v-if="hoge.isShow">表示</p>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
name: 'HelloWorld',
setup() {
const hoge = reactive({})
const show = () => {
hoge.isShow = true
}
return { hoge, show }
}
}
</script>
Vue2.x
の場合、ボタンを押しても表示の文字が出ないことは、【Vue.js】オブジェクトのプロパティを追加してもリアクティブに動作しなかった時の備忘録の記事で説明しましたが...
Vue3
から導入されたreactiveメソッド
によってこの課題が解決されました。
reactiveメソッド
から返されるオブジェクトは、プロパティが追加された場合でもリアクティブに動作させる事が可能になります。🙌🦒
Reactivity API
The reactive conversion is "deep"—it affects all nested properties.
Vue3環境でVue2.xコードを書いて動作確認してみる
Vue2.x
では、リアクティブに動作しなかったコードを、Vue3
環境で動かすとどうなるのか確認してみました。
<template>
<div>
<button @click="show">表示する</button>
<p v-if="hoge.isShow">表示</p>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data () {
return {
hoge: {
// isShow: false, コメントアウトで未定義にしています
}
}
},
methods: {
show () {
this.hoge.isShow = true
}
}
}
</script>
Vue3
ではリアクティブなプロパティとして認識されるようになっていました。
この挙動になる理由について記載されたリファレンス等は見つかり次第追記していきます。🦒