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

「Nuxt.jsビギナーズガイド」の感想・備忘録2

「Nuxt.jsビギナーズガイド」の感想・備忘録1の続き

Nuxt.jsの基本

pagesディレクトリ

<template>
  <h1>id: {{ $route.params.id }}</h1>
</template>
<!-- またはdataでuserId: this.$route.params.idとして -->
<template>
  <h1>id: {{ userId }}</h1>
</template>
<!-- users/_userId/posts/_postId.vueに/users/100/posts/200でアクセスした場合 -->
<ul>
  <li>userId: {{ $route.params.userId }}</li>
  <li>postId: {{ $route.params.postId }}</li>
</ul>
<!-- ※ users/_userId/index.vueとusers/_userId.vueのようにディレクトリ名とファイル名が同じ_xxxxだとファイルの方が優先される。 -->

axios-module

使い方

1. npm install @nuxtjs/axios
2. nuxt.config.jsに追記
modules: ['@nuxtjs/axios'],
axios: {},
3. jsを記述
async asyncData({app}) {
  const json = await app.$axios.$get('https://qiita.com/api/v2/items?query=tag=nuxt.js');
  return { json };
},

asyncData()フック

head()によるHTMLメタの設定

head: {
  title: 'my-first-nuxt-app',
  titleTemplate: '%s | Nuxt.js Test',
  // 以下省略
}
head() {
  return {
    title: 'nuxt.jsタグ一覧',
  }
}
// headメソッドはnuxt.config.jsのheadの値をオーバーライド(差分のみ)する。

vuex

クラシックモード

クラシックモードのサンプル
import Vuex from 'vuex';

export default () =>
  new Vuex.Store({
    state: {
      articles: [],
    },
    mutations: {
      setArticles(state, {articles}) {
        state.articles = articles;
      },
    },
    actions: {
      setArticles({commit}, {articles}) {
        commit('setArticles', {articles});
      },
    },
  })

各コンポーネントからは、this.$storeでアクセスすることができる。
asyncDataフックでは以下のようになる。

asyncData({store}) {
  store.dispatch('setArticles', {articles: [1, 2]});
  console.log(store.state.articles);
}

モジュールモード

Nuxt.jsはstoreディレクトリ内のファイルに対して、以下のルールで動作する。

モジュールモードのサンプル
export const state = () => ({
  isLoading: false
})
export const mutations = {
  setIsLoading(state, isLoading) {
    state.isLoading = isLoading
  }
}
export const state = () => ({
  list: []
})

export const mutations = {
  addUser(state, user) {
    state.list.push(user)
  }
}

export const actions = {
  addUser({ commit }, { user }) {
    commit('addUser', user)
  }
}

usersはモジュールとして扱われるため、gettersやactionsへのアクセスは以下のようになる。

上記の例はクラシックモードで以下のようにindex.jsを記述した場合と同等に扱われる。

import Vuex from 'vuex';

export default () =>
  new Vuex.Store({
    state: {
      isLoading: false
    },
    mutations: {
      setIsLoading(state, isLoading) {
        state.isLoading = isLoading
      }
    },
    modules: {
      users: {
        state: {
          list: [],
        },
        mutations: {
          addUser(state, user) {
            state.list.push(user)
          },
        actions: {
          addUser({ commit }, { user }) {
            commit('addUser', user)
          },
        },
      },
    },
  })
モバイルバージョンを終了