NuxtJS + Vuex - 商店中的数据

Emm*_*iat 4 javascript vuex vuejs2 nuxt.js

使用NuxtJS(一个VueJS框架),我试图从布局模板中的REST API中获取一堆数据(不能使用经典的fech()或asyncData()方法).

所以我正在使用vuexnuxtServerInit()动作.这样,无论当前页面如何,我都应该能够在加载应用程序期间直接收集所有数据.

但我无法让它发挥作用.

这是我的商店map.js文件:

import axios from 'axios'

const api = 'http://rest.api.localhost/spots'
 
export const state = () => ({
	markers: null
})

export const mutations = {
	init (state) {
		axios.get(api)
			.then((res) => {
				state.markers = res.data
			})
	}
}

export const actions = {
	init ({ commit }) {
		commit('init')
	}
}
Run Code Online (Sandbox Code Playgroud)

而index.js(可以触发nuxtServerInit()):

export const state = () => {}

export const mutations = {}

export const actions = {
	nuxtServerInit ({ commit }) {
		// ??
		console.log('test')
	}
}
Run Code Online (Sandbox Code Playgroud)

但我无法让它发挥作用.医生说:

如果您使用的是Vuex存储的模块模式,则只有主模块(在store/index.js中)才会收到此操作.您需要从那里链接模块操作.

但我不知道我将如何做到这一点.如何调用另一个模块/文件中定义的操作?

我试图复制各种例子,但从未让它们起作用; 这是我能想到的最好的.

我错过了什么?如果需要,这里是repostore文件夹

谢谢!

Sch*_*esi 7

几个星期前我遇到了同样的问题,这就是我解决它的方法:

store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
import auth from './modules/auth'
import auth from './modules/base'

Vue.use(Vuex)

export default () => {
  return new Vuex.Store({
    actions: {
      nuxtServerInit ({ commit }, { req }) {
        if (req.session.user && req.session.token) {
          commit('auth/SET_USER', req.session.user)
          commit('auth/SET_TOKEN', req.session.token)
        }
      }
    },
    modules: {
      auth,
      base
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

存储/模块/ auth.js

const state = () => ({
  user: null,
  token: null
})

const getters = {
  getToken (state) {
    return state.token
  },
  getUser (state) {
    return state.user
  }
}

const mutations = {
  SET_USER (state, user) {
    state.user = user
  },
  SET_TOKEN (state, token) {
    state.token = token
  }
}

const actions = {
  async register ({ commit }, { name, slug, email, password }) {
    try {
      const { data } = await this.$axios.post('/users', { name, slug, email, password })
      commit('SET_USER', data)
    } catch (err) {
      commit('base/SET_ERROR', err.response.data.message, { root: true })
      throw err
    }
  },
  /* ... */
}

export default {
  namespaced: true,
  state,
  getters,
  mutations,
  actions
}
Run Code Online (Sandbox Code Playgroud)



请注意commit('base/SET_ERROR', err.response.data.message, { root: true })在另一个模块(称为base)中调用变异的行.和namespaced: true选项,这是必须的.

要了解有关vuex模块中命名空间的更多信息,请参阅文档:https://vuex.vuejs.org/en/modules.html