nuxt-ts day4:axiosでランダム猫画像
4日目。今日は axios をメインにやった。

https://nuxt-ts-sample.netlify.app/axios
ランダムで猫の画像が表示されるページを作りました。
typesディレクトリに型定義を分離
型定義だけを専用のディレクトリで管理してみる。
こんなファイルを作って、
types\user.ts
export interface User {
  firstName: string
  lastName: string
}
任意のコンポーネントで読み込む。
components\User.vue
import { User } from '~/types/user'
これで複数個所で使いまわせるようになりました。見通しも良くなった気がします。
nuxt_config.ts の設定
config ファイルも型定義できるようなのでやってみる。
ここの記述はバージョンアップなどで結構頻繁に変わっているらしい。過去の記事を漁ってると何パターンかあった。
nuxt.config.ts
import { NuxtConfig } from '@nuxt/types'
const nuxtConfig: NuxtConfig = {
  ...
}
module.exports = nuxtConfig
axiosをインストールする
axios でも型を使いたいので色々と設定していきます。
npm install @nuxtjs/axios
plugins\axios-accessor.ts
import { Plugin } from '@nuxt/types'
import { initializeAxios } from '~/utils/api'
export const accessor: Plugin = ({ $axios }): void => {
  initializeAxios($axios)
}
export default accessor
utils\api.ts
/* eslint-disable import/no-mutable-exports */
import { NuxtAxiosInstance } from '@nuxtjs/axios'
let $axios: NuxtAxiosInstance
export function initializeAxios (axiosInstance: NuxtAxiosInstance): void {
  $axios = axiosInstance
}
export { $axios }
nuxt.config.ts
  plugins: [
    '@/plugins/composition-api',
    '@/plugins/axios-accessor'
  ],
これでどこからでも axios が参照できるようになりました。
axiosで猫画像を取得する
https://aws.random.cat/meow
このAPIを呼び出して、猫画像を取得してみます。
pages\axios.vue
<template>
  <div class="justify-center items-center text-center mx-auto">
    <h1>randomCat (axios)</h1>
    <button class="bg-green-500 hover:bg-green-700 text-white font-bold py-2 px-4 rounded" @click="changeCat">
      change 🐱
    </button>
    <br><br>
    <img :src="state.cat_url" alt="">
  </div>
</template>
<script lang="ts">
import { onMounted, defineComponent, reactive } from '@vue/composition-api'
import { $axios } from '~/utils/api'
export default defineComponent({
  setup () {
    const state = reactive({
      cat_url: '' as string
    })
    const asyncFunc = async (): Promise<void> => {
      const CatObj: {file: string} = await $axios.$get('https://aws.random.cat/meow')
      state.cat_url = CatObj.file
    }
    const changeCat = () => { asyncFunc() }
    onMounted(() => { asyncFunc() })
    return {
      state, changeCat
    }
  }
})
</script>
今日はここまで。