サイトアイコン 上尾市のWEBプログラマーによるブログ

「速習Vue.js3 Composition API編」の感想・備忘録2

「速習Vue.js3 Composition API編」の感想・備忘録1の続き

コンポーネント

プロパティ

<script setup>
const props = defineProps([
  msg: {
    type: String,
    required: true
  );
  num: {
    type: Number,
    default: 0
  );
]);
console.log(props);
</script>
<template>
  <p>{{ msg }}: {{ num }}</p>
</template>

呼び出し

<Hoge msg="aaaa" :num="100" />

値の更新

カスタムイベント

<script setup>
const emits = defineEmits(['increment']);
const handleClick = emits('increment', 999);
</script>
<template>
  <input type="button" @click="handleClick" value="step" />
</template>

呼び出し

<script setup>
const handleIncrement = num => console.log(num);
</script>
<template>
<Hoge @increment="handleIncrement" />
</template>

Provide / Inject

上位コンポーネント

<script setup>
import { ref, provide } from 'vue'
const nums = ref([100, 777, 30, 5]);
provide('list', nums);
provide('str', 'hoge');
</script>

子孫コンポーネント

<script setup>
import { Inject } from 'vue'
const nums = inject('list');
const str = inject('str');
</script>

値の操作

上位コンポーネント
<script setup>
import { ref, provide } from 'vue'
const nums = ref([100, 777, 30, 5]);
const deleteNum = i => nums.value.splice(i, 1);
provide('list', {nums, deleteNum});
</script>
子孫コンポーネント
<script setup>
import { Inject } from 'vue'
const {nums, deleteNum} = inject('list');
</script>

コンポジション関数

<script setup>
import { ref } from 'vue'
export default function() {
  const books = ref([{title: '書籍1'}, {title: '書籍2'}]);
  const deleteBook= i => books.value.splice(i, 1);
  return {books, deleteBook};
}
</script>

呼び出し

<script setup>
import useBook from '../composite/useBook'
provide('list', useBook());
/*
下記のように書いてもいいが、上記の方が簡潔に書ける
const {books, deleteBook} = useBook();
provide('list', {books, deleteBook});
*/
</script>
モバイルバージョンを終了