見出し画像

Vue.js勉強記録その23 Vue3を更にパワーアップしよう 5-1 ver2

こちらの書籍でvue.jsの勉強をしています。
内容をログの代わりに書いています。

今回は、Composition APIのメソッドについてと、setupに渡される引数である、contextについてと、Composition APIについてのまとめです。

■Composition APIを使おう

・メソッドの使い方

従来の記述でコンポーネントを書いた時の、methodsは使わず、setup内で変数に関数を代入する形で使う。

HelloWorld.vue

<template>
 <div class="alert alert-primary">
   <h1>{{ title }}</h1>
   <p>{{ data.msg }}</p>
   <div>
     <input type="number" v-model="data.num" min="0" class="form-control" />
   </div>
   <button class="btn btn-primary m-3" v-on:click="action">Click</button>
 </div>
</template>

<script>
import { ref, reactive } from "vue";
export default {
 props: {
   title: String,
 },
 setup(props) {
   const data = reactive({
     msg: "This is reactive-value!",
     num: 0,
   });
   const action = () => {
     let total = 0;
     for (let i = 0; i <= data.num; i++) {
       total += i;
     }
     data.msg = "total: " + total;
   };
   return {
     data,
     action,
   };
 },
};
</script>

setupの中に、以下の記述がある。

 const action = () => {
    let total = 0;
    for (let i = 0; i <= data.num; i++) {
      total += i;
    }
    data.msg = "total: " + total;
};

この部分で、変数action(constなので定数)にアロー関数の形で関数を入れている。

関数の内容は、data.numの数まで足し算した結果を、data.msgに入れている。

data.numとdata.msgは、同じくsetup内の、

const data = reactive({
    msg: "This is reactive-value!",
    num: 0,
});

この記述で定義されている。

ボタンを押すと、actionメソッドが走る様になっている。

data.numは、v-model="data.num"でinputと紐づいている。

スクリーンショット 2022-03-14 0.54.29

ブラウザで見るとこんな感じ。画像の例の場合、10までの数を0から足して、結果が55と表示されている。


・setupのcontextについて

propsと同様に、setupにはcontextという引数も渡されている。

contextは、コンポーネントに関する情報をオブジェクトで持っている。

以下が一例。

attrs・・・・コンポーネントタグに用意された属性をまとめたもの
slots・・・・コンポーネント内に含まれるスロットをまとめたもの
emit・・・・emitされた内容をまとめたもの

例えば、attrsを使えば、propsで設定していない属性値を子コンポーネント側で取得できる。

HelloWorld.vue

<template>
 <div class="alert alert-primary">
   <h1>{{ title }}</h1>
   <p class="mt-3 h5">{{ data.msg }}</p>
 </div>
</template>

<script>
import { ref, reactive } from "vue";
export default {
 props: {
   title: String,
 },
 setup(props, context) {
   const data = reactive({
     msg: "This is reactive-value!",
   });
   data.msg = context.attrs["msg"].toUpperCase();
   return {
     data,
   };
 },
};
</script>

propsでは、titleしか定義していないが、
data.msg = context.attrs["msg"].toUpperCase();
この記述で、msgを取得しようとしている。

App.vue

<template>
 <HelloWorld title="Composition API" msg="This is Composition API sample." />
</template>

親側で、msgに属性値を入れると、

スクリーンショット 2022-03-14 1.07.14

普通に表示される。

こちらの方法は、筆者の方はあまりお勧めではないらしいw
同じことをやるなら素直にpropsを使った方がわかりやすいとの事。確かに、必要な(設定できる)属性が、propsを見れば一目で判る状態の方がコードが読みやすいですね。


■Composition APIのまとめ

vue3になり、Composition APIを使ったコンポーネントの作成ができる様になった。

なぜCompositon APIで書ける様にしたかというと、従来の方法だと、複雑なコンポーネントになると、色々な情報が雑多に散らばってしまうから。

なので、propsとsetupしかないシンプルな記述であるComposition APIが生まれた。

ちなみに、Composition APIは、従来の書き方とある程度の互換性があり、methodsやcomputedも同時に書くことができる。

export default{
  props:{内容},
  setup(props,context){内容},
  computed:{内容},
  methods:{内容}
}

こんな感じにpropsとsetupの続きに、computedやmethodsが書ける。

なので、少しずつ従来の書き方からComposition APIに移行するのがお勧めとの事。


■(この記事の)まとめ

今回は、Composition APIでメソッドを使う方法と、setupに渡されるcontextについてでした。

また、CompositionAPIに関するまとめもありました。

基本的には、従来の方法よりはComposition APIの方がシンプルに書けるからお勧めとの事だが、僕はvue3から勉強を始めているので、従来の方法の問題点がなかなかピンとこないですねw
まぁ今回みたいに、ある技術を途中から学ぶと、あるあるの疑問点ですね。ひとまず、筆者の言うことを信じて、なるべくComposition APIで、無理なら従来の方法で書いてみようと思います。

いいなと思ったら応援しよう!