我已经开始在应用程序中实现Vuex,我决定将商店拆分为模块。
一开始我只创建了一个模块来测试Vuex模块的工作方式,因为我以前没有任何经验。
我创建了一个modules文件夹,在其中有一个名为公司的模块文件夹。在公司文件夹中,我创建了下一个文件: action.js,getters.js,index.js,mutations.js 。
这些文件中的代码:
action.js :
import api from '@/vuex/utils/api'
const getCompanies = (context) => {
api.get('/57/companies').then(response => {
context.commit('GET_COMPANIES', response)
}).catch((error) => {
console.log(error)
})
}
export default {
getCompanies
}
注意:在我导入的 api 中,我刚刚创建了用于基本操作的方法(get,post,delete等)
getters.js:
const allCompanies = state => state.companies
export default {
allCompanies
}
mutations.js:
const GET_COMPANIES = (state, companies) => {
state.companies = companies
}
export default {
GET_COMPANIES
}
index.js:
import actions from './action'
import getters from './getters'
import mutations from './mutations'
const state = {
companies: []
}
export default {
namespaced: true,
state,
actions,
getters,
mutations
}
创建此模块后,我将其添加到我的商店中,如下所示:
store.js:
import Vue from 'vue'
import Vuex from 'vuex'
import companyModule from './modules/company'
Vue.use(Vuex)
const store = new Vuex.Store({
modules: {
company: companyModule
}
})
export default store
注意我已经告诉我的vue应用在 main.js 文件
中使用此存储为了测试这一点,我创建了一个简单的HelloWorld组件,在其中尝试将数据加载到简单的html表中。这里出现了问题。在 mount 挂钩中,我已调度名为 getCompanies 的操作,我可以在表中看到数据,该表在那里,但是在开发控制台中却出现错误,告诉我:
vuex.esm.js?358c:417 [vuex]未知操作类型:getCompanies
HelloWorld组件的代码:
import { mapGetters } from 'vuex'
...
computed: {
...mapGetters({
companies: 'company/allCompanies'
})
}
...
mounted () {
this.$store.dispatch('company/getCompanies')
}
...
数据存储在我的商店中,请从vue devtools中检查屏幕截图:
所以我的问题是为什么我要在控制台内收到此错误,我丢失了什么,以及如何解决该错误。谢谢!
答案 0 :(得分:2)
在store.js中使用模块时,请注意使用
export const namespaced = true
和否
export const namespaces = true
在您的modules / foo.js文件中。丑陋的错字!
答案 1 :(得分:0)
您可以使用
对其进行修复this.$store.dispatch('company/getCompanies', null, {root:true})
还在组件中使用mapActions
方法
答案 2 :(得分:0)
尝试一下:
import { mapGetters, mapActions} from 'vuex'
computed: {
...mapGetters({
companies: 'company/allCompanies'
})
}
methods: {
...mapActions(['company/getCompanies'])
},
mounted() {
this['company/getCompanies']();
},
但是,我喜欢按照以下步骤进行命名间隔设置,但是存在问题,请参阅问题here。
methods: {
...mapActions('company', ['getCompanies'])
},
mounted() {
this.getCompanies();
},
答案 3 :(得分:-3)
请删除 namespaced: true 并重试。