もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

Vue3超入門 vol.1

はじめに

こんばんは。

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調べてみます。

現場からは以上です。