##はじめに
vue3.0ではtypescriptとの互換性の向上やslotの扱いの変更、suspenseの追加など様々な変更点や機能追加がありますが、今回はその中でもcomposition api
について触れたいと思います。細かい仕様についてお話するというより、同じアプリケーションを従来のvue2.x
(options api)での書き方と、vue3.x
(composition api)でどう変わるのか簡単に見ていきたいと思います。
##composition api って?
「コンポーネントロジックオン柔軟なコンポジションを可能にする機能ベースのAPIのセット」(ほぼ公式の直訳ですが)とのことです。
また、公式では以下の特徴が挙げられています。
- 保守性の向上
- 再利用性の向上
実際に簡単なアプリケーションの実装を通してこれらの変化を確認してみたいと思います!
##実際にアプリケーションを作る
無料の為替APIを使用して、inputに入力した数字をリアルタイムでドルに変換するという簡単なもの作成します。
###Vue2.x options api での書き方
<template lang="pug">
#app
h2 currency converter
.content__wrap
.content__item
span 現在
h3 1ドル =
span {{rates.JPY}} 円
input(type="number" v-model="num")
p 円 =
p {{result}} ドル
</template>
<script>
import axios from 'axios'
export default {
name: 'App',
data(){
return {
num:null,
res:null,
rates:null
}
},
mounted(){
this.getRate()
},
methods:{
async getRate(){
this.res = await axios.get(process.env.VUE_APP_API_URL)
this.rates = this.res.data.rates
}
},
computed:{
result(){
return this.num * this.rates.JPY
}
}
}
</script>
こちらに関してはあまり説明する必要もないかもしれませんが、methods
で非同期処理を行い、それをmounted
時に実行しています。またcomputed
でinputで入力された値と、為替のレートをかけた値を返しています。
###Vue3.x composition api での書き方
まずは準備として、
npm install @vue/composition-api
インストール後、インポートします。
import VueCompositionApi from "@vue/composition-api";
Vue.use(VueCompositionApi);
そして、先ほど同様のアプリケーションを実装していきます。
<template lang="pug">
#app
h2 currency converter
.content__wrap
.content__item
span 現在
h3 1ドル =
span {{state.rates.JPY}} 円
input(type="number" v-model="state.num")
p 円 =
p {{state.result}} ドル
</template>
<script>
import axios from 'axios'
import { defineComponent, reactive, computed, onMounted } from '@vue/composition-api'
export default defineComponent({
name: 'App',
setup(){
const state = reactive({
num:null,
data:null,
rates:{},
result:computed(() => state.num * state.rates.JPY),
})
async function getRate(){
state.data = await axios.get(process.env.VUE_APP_API_URL)
state.rates = state.data.data.rates
}
onMounted(() => {
getRate()
})
return{
state,
getRate
}
},
})
</script>
パッと見結構変わってますよね。
###ざっくりどう違うのか?
Vue2.x
でのdata()
に相当するプロパティはVue3.x
ではsetup()
で宣言します。
また、今回のアプリケーションの場合、state,getRate
のようなtemplete
内で使用する関数に関してはreturn
で返します。
ライフサイクルフックに関して、今回はmounted
を使用していますが、Vue2.x
とVue3.x
では書き方が大きく変わり、Vue3.x
ではsetup()
関数内でonMounted
と宣言し設定します。そのほかのライフサイクルフックに関しても同様です。
##最後に
今回は、来たるVue3.x
に向けてcomposition api
の書き方を試してみました。私自身まだoptions api
の書き方に慣れていますが、composition api
はより大きなアプリケーションを構築する場合、保守性(コードの可読性)など上がってくるのかなと感じました。
やはり書き方的に大きな変化ではあるので、これまでoptions api
で実装してきたサービスに一気に導入していくのはなかなか難しい部分もありそうです。
Vue3のリリースに向けさらに勉強し、ご紹介できればと思います!!