はじめに
こんばんは。
vue3の入門を頑張ってやってみます。
参考書籍は Web+DB Press vol. 120の 「最新Vue.js3入門」です。
今回は Composition APIです。
参考サイト
本題
さっそくやってみた
Composition APIはざっくり、関数ベースでコンポーネント定義ができる機能のようです。
今までのコンポーネント定義(Options API)とは違い、 setup()というメソッド内に機能を記述していく形です。
Composition APIで作った場合
<template>
<div>
<label>名字:</label>
<input type="text" v-model="state.lastName" />
</div>
<div>
<label>名前:</label>
<input type="text" v-model="state.firstName" />
</div>
<div>
<label>注文個数(単価100円): </label>
<input type="number" v-model="state.amount" />
</div>
<div>
<label>合計: </label>
<span>{{ totalFormat }}</span>
</div>
<div>
<button type="button" @click="onClick">submit!!</button>
</div>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
name: "CompositionExample",
setup() {
const state = reactive({
lastName: '',
firstName: '',
amount: 0
})
const totalFormat = computed(() => (state.amount * 100).toString().replace(
/(\d+?)(?=(?:\d{3})+$)/g,
function (x) {
return x + ',';
}))
const onClick = () => {
alert(`${state.lastName} ${state.firstName}さん。購入ありがとうございました。`)
}
return {
state,
totalFormat,
onClick,
}
}
}
</script>
<style scoped>
</style>
Options APIで作った場合
<template>
<div>
<label>名字:</label>
<input type="text" v-model="lastName" />
</div>
<div>
<label>名前:</label>
<input type="text" v-model="firstName" />
</div>
<div>
<label>注文個数(単価100円): </label>
<input type="number" v-model="amount" />
</div>
<div>
<label>合計: </label>
<span>{{ totalFormat }}</span>
</div>
<div>
<button type="button" @click="onClick">submit!!</button>
</div>
</template>
<script>
export default {
name: "OptionsApiExample",
data() {
return {
lastName: '',
firstName: '',
amount: 0
}
},
methods: {
onClick() {
alert(`${this.lastName} ${this.firstName}さん。購入ありがとうございました。`)
}
},
computed: {
totalFormat() {
return (this.amount * 100).toString().replace(
/(\d+?)(?=(?:\d{3})+$)/g,
function (x) {
return x + ',';
}
);
}
}
}
</script>
<style scoped>
</style>
ざっくり作ったんですが、こんな感じの違いっぽいです。
setup()内に全部集約されている感じですね。
reactive の他に ref もあるみたいです。
どちらもリアクティブな値に出来るようですが、どちらを使うのが良いのでしょうか?
本読んだ感じ、ざっくり、 reactive が複数 ref が単数という感じでした。
その他にも、 refで作成した値は、 script 内では、 ○○.value という感じで呼び出して、 template 側では ○○ という感じでアクセスできます。
これはなにが嬉しいの?
例えば
「こっちのコンポーネントの、このデータ、もしくは機能をこっちのコンポーネントでも使いたい!!!」
みたいなニーズって、大規模になればなるほどでてくると思います。
これ、従来だと、なんとか親子関係にしたり、vuexとかつかって、表現したりするのでしょうか?
これが、関数ベースのComposition APIの場合は、注入しやすくなるみたいです!
リアクティブなデータをパーツパーツで細かく分けて、必要とするコンポーネントに注入できるという感じでした。
終わりに
Compositon API なかなかおもしろいですね。
ただ、設計が柔軟にできるようになる代わりに、設計が大事になってくる感じですね。。。
次は、teleport調べてみます。
現場からは以上です。
