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

「Vue.js3やさしい入門書」の感想・備忘録2

「Vue.js3やさしい入門書」の感想・備忘録1の続き

スロット

親コンポーネント

<template>
  <Ko>ほげほげ</Ko>
</template>

子コンポーネント

<template>
  <slot>デフォルト値</slot>
</template>

propsとslotの使い分け

<!-- 以下のような場合はslotにするべき -->
<template v-if="flag">
  <h1>Vue.js!</h1>
</template>
<template v-else>
  <p>Error!!!</p>
</template>

名前付きスロット

親コンポーネント

<template>
  <Ko>
    <template v-slot:default>defaultスロットです。</template>
    <template #explanation>説明文のテストです。</template>
  </Ko>
</template>

子コンポーネント

<template>
  <slot>defaultスロットのデフォルト値</slot>
  <slot name="explanation">名前付きスロットのデフォルト値</slot>
</template>

スコープ付きスロット

親コンポーネント

<template>
  <Ko>
    <template v-slot="slotProps">msg: {{ slotProps.msg }}、num: {{ slotProps.num }}</template>
  </Ko>
</template>

子コンポーネント

<script setup>
import { ref } from 'vue'
const msg = ref('hoge')
</script>

<template>
 <slot :msg="msg" :num="777"></slot>
</template>

以下では子コンポーネントの変数を参照することはできない。

親コンポーネント

<template>
  <Ko>{{ msg }}</Ko>
</template>

子コンポーネント

<script setup>
import { ref } from 'vue'
const msg = ref('hoge')
</script>

<template>
  <slot></slot>
</template>

Pinia

Piniaの使い方

ステートの作成

import { defineStore } from "pinia";
export const useStore = defineStore('counter', {
  state: () => ({
    count: 0,
    score: 0,
  })
})

main.jsの修正

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import './style.css'
import App from './App.vue'

const pinia = createPinia()
createApp(App).use(pinia).mount('#app')

コンポーネントからアクセス

<script setup>
import { useStore } from '../../stores/counter'

const store = useStore()
</script>

<template>
  <p>store.counter: {{ store.counter }}</p>
</template>

ゲッター

import { defineStore } from "pinia";
export const useStore = defineStore('counter', {
  state: () => ({
    count: 1,
    memo: 'hoge',
  }),
  getters: {
    double: (state) => state.count * 2
  }
})

コンポーネントからアクセス

<script setup>
import { useStore } from '../../stores/counter'

const store = useStore()
</script>

<template>
  <p>store.counter: {{ store.double }}</p>
</template>

アクション / リセット

import { defineStore } from "pinia";
export const useStore = defineStore('counter', {
  state: () => ({
    count: 1,
    memo: 'hoge',
  }),
  getters: {
    double: (state) => state.count * 2
  },
  actions: {
    countUp(step=1) {
      this.count += step
    }
  }
})

コンポーネントからアクセス

<script setup>
import { useStore } from '../../stores/counter'

const store = useStore()
const countUp = () => {
  store.countUp()
}
const reset = () => {
  store.$reset()
}
</script>

<template>
  <p>store.count: {{ store.count }}</p>
  <p><button @click="countUp">countUp</button></p>
  <p><button @click="store.countUp(3)">3 countUp</button></p>
  <p><button @click="reset">reset</button></p>
  <p><button @click="store.$reset()">reset</button></p>
</template>

storeToRefs関数

<script setup>
import { useStore } from '../../stores/counter'
import { storeToRefs } from 'pinia'

const store = useStore()
let {memo} = storeToRefs(store)
memo.value = 'hogehoge'
</script>

<template>
  <p>storeToRefs: {{store.memo}}</p>
</template>
モバイルバージョンを終了