LoginSignup
1
2

More than 3 years have passed since last update.

Vuex~Vue.jsとNuxt.jsで書き方がちょっと違う!?

Posted at

はじめに

勉強中の身です、そのため勘違い等あるかもしれません。
Vue.jsでのVuexの書き方?はなんとなくわかっているつもりで
今回簡単なアプリをNuxt.jsで書こうと思いってVuexの書き方でハマったのでメモとして残します。

Vue.jsの場合

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export const state = {
  nowNumber: 0,
};

export const mutations = {
  increment(state) {
    state.nowNumber++;
  },
  decrement(state) {
    if (state.nowNumber <= 0) return;
    state.nowNumber--;
  },
  reset(state) {
    state.nowNumber = 0;
  },
};

export const actions = {
  increment({ commit }) {
    console.log('increment');
    commit('increment');
  },
  decrement({ commit }) {
    console.log('decrement');
    commit('decrement');
  },
  reset({ commit }) {
    console.log('reset');
    commit('reset');
  },
};

export default new Vuex.Store({
  state,
  mutations,
  actions,
});

コード自体は気にせずに
こんな感じですよね

これを分割して書くと

export const state = {
  nowNumber: 0,
};

こんな感じでファイルをわけて

import Vue from 'vue';
import Vuex from 'vuex';
import state from './state.js'
import mutations from './mutations.js'
import actions from './actions.js'

Vue.use(Vuex);

export default new Vuex.Store({
  state,
  mutations,
  actions,
});

でそのファイルをimportしたら同じ用に使える。

Nuxt.jsの場合

store/index.js

export const state = () => ({
  nowNumber: 0,
});

export const mutations = {
  //省略
};

export const actions = {
  //省略
};

export default ({
  state,
  mutations,
  actions,
});

違いとしてNuxt.jsの場合Vuexが組み込みになっているみたいなので
importの必要がないのとstate関数になる
問題はここからで、これを分割する場合、上のVue.jsの時と同じ書き方をするとできない。。。
ちゃんと動くようにするには

actions.js
import getters from './getters'

export default {
  postMessage({ commit }, message) {
    const postData = {
      id: getters.fetchId(),
      memo: message,
      date: getters.fetchDate(),
    }
    commit('messageBox', postData)
  },
}
getters.js
export default {
 fetchId() {
    const id = //省略
    return id
  },

  fetchDate() {
    const d = new Date()
    const date = `${d.getFullYear()}${d.getMonth() + 1}${d.getDate()}日`
    return date
  },
}

export defaultなんですね中身の書き方は同じ感じ
actionsgetters使いたいとかの場合importする必要があるっぽい
後はこれをindex.jsimport

store/index.js
import getters from './getters'
import actions from './actions'
export const state = () => ({
  messages: [],
  sample: 'test',
})

export const mutations = {
  messageBox(state, messageData) {
    state.messages.push(messageData)
  },
}

export default {
  state,
  mutations,
  actions,
  getters,
}

これで無事使えるようになった!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2