Vuex with Nuxt Error: this.$store is undefined
Vuex with Nuxt Error: this.$store is undefined
我在编写 Nuxt 课程时遇到了以下错误,当然它在教程中有效。
TypeError: can't access property "dispatch", this.$store is undefined
store/index.js 文件:
import Vuex from "vuex";
const createStore = () => {
return new Vuex.Store({
state: { loadedPosts: [] },
mutations: {
setPosts(state, posts) {
state.loadedPosts = posts;
},
},
actions: {
setPosts(vuexContext, posts) {
vuexContext.commit("setPosts", posts);
},
},
getters: {
loadedPosts(state) {
console.log("imhere");
return state.loadedPosts;
},
},
});
};
export default createStore;
posts/index.vue 文件中的script
:
<script>
export default {
data() {
return {
loadedPosts: [{id: "1",title: "First Post"}],
};
},
created() {
this.$store.dispatch("setPosts", this.loadedPosts);
},
};
</script>
首先,如果你有 store/index.js,你不必导入 vuex。 Nuxt 将查找存储目录。如果它包含的文件不是隐藏文件或 README.md 文件,则商店将被激活。这意味着 Nuxt 将:
- 导入 Vuex。
- 将存储选项添加到根 Vue 实例。
现在,如果由于某种原因未导入 vuex 和商店(如果在设置项目时没有将任何 .js 文件放在 /store 中),则 $store 将不可用。
您可以在 .nuxt/index.js 文件夹中查看是否导入了 store 或 vuex。
如果未导入,您可以按照 4 种方法在 Nuxt 中正确设置 vuex。
方法一:根名称space,一个文件
让我们从最简单的商店设置开始,一个文件。如果你创建 /store/index.js,你可以用你的状态、突变、动作和吸气剂来填充它。使用此设置,没有名称space,一切都在这个文件中。
// holds your root state
export const state = () => ({
counter: 0
})
// contains your actions
export const actions = {
counterUp({ state, commit }){
commit('setCounter', state.counter + 1)
}
}
// contains your mutations
export const mutations = {
setCounter(state, value){
state.counter = value
}
}
// your root getters
export const getters = {
myGetter(state){ return state.counter + 1000}
}
方法 2:根名称space,每个 Intent 一个文件
如果您的商店代码有点太大,您可以有意拆分您的商店!只需删除您的 index.js 并为状态、动作、突变和吸气剂创建文件。 Nuxt 会自动将它们构建为根名称 space 中的一个商店。从上面的示例中,我们只需要将每个部分移动到它自己的文件中并使用默认值
export.
// /store/state.js
export default () => ({
counter: 0
})
// /store/actions.js
export default {
counterUp({ state, commit }){
commit('setCounter', state.counter + 1)
}
}
// /store/mutations.js
export default{
setCounter(state, val){
state.counter = val
}
}
// /store/getters.js
export default {
myGetter(state){ return state.counter + 1000}
}
方法三:名称spaced,一个文件
如果您想在您的应用中使用 namespaces,但仍需要单个文件作为 space,只需将您的单个文件命名为 namespace倒是喜欢它的内容。如果我们从方法 1 中获取 index.js 并将其命名为 cart.js,那么所有的 getter、动作、突变和状态都将位于购物车名称 space 下。
要访问名称space 中的状态,只需在状态属性.
之后使用带有名称space 名称的计算属性
computed:{
counter(){
return this.$store.state.cart.counter
}
}
如果你想在名称space中执行一个动作,你可以添加名称space + 斜线 + 动作名称。
this.$store.dispatch('cart/counterUp')
方法 4:名称spaced,每个 Intent 一个文件
正如您可能已经猜到的那样,您也可以拥有一个名称spaced 商店,您的意图也可以分开!如果我们采用方法 2 并将每个文件移动到一个名为 cart 的文件夹中,它看起来像这样。
我在编写 Nuxt 课程时遇到了以下错误,当然它在教程中有效。
TypeError: can't access property "dispatch", this.$store is undefined
store/index.js 文件:
import Vuex from "vuex";
const createStore = () => {
return new Vuex.Store({
state: { loadedPosts: [] },
mutations: {
setPosts(state, posts) {
state.loadedPosts = posts;
},
},
actions: {
setPosts(vuexContext, posts) {
vuexContext.commit("setPosts", posts);
},
},
getters: {
loadedPosts(state) {
console.log("imhere");
return state.loadedPosts;
},
},
});
};
export default createStore;
posts/index.vue 文件中的script
:
<script>
export default {
data() {
return {
loadedPosts: [{id: "1",title: "First Post"}],
};
},
created() {
this.$store.dispatch("setPosts", this.loadedPosts);
},
};
</script>
首先,如果你有 store/index.js,你不必导入 vuex。 Nuxt 将查找存储目录。如果它包含的文件不是隐藏文件或 README.md 文件,则商店将被激活。这意味着 Nuxt 将:
- 导入 Vuex。
- 将存储选项添加到根 Vue 实例。
现在,如果由于某种原因未导入 vuex 和商店(如果在设置项目时没有将任何 .js 文件放在 /store 中),则 $store 将不可用。 您可以在 .nuxt/index.js 文件夹中查看是否导入了 store 或 vuex。 如果未导入,您可以按照 4 种方法在 Nuxt 中正确设置 vuex。
方法一:根名称space,一个文件
让我们从最简单的商店设置开始,一个文件。如果你创建 /store/index.js,你可以用你的状态、突变、动作和吸气剂来填充它。使用此设置,没有名称space,一切都在这个文件中。
// holds your root state
export const state = () => ({
counter: 0
})
// contains your actions
export const actions = {
counterUp({ state, commit }){
commit('setCounter', state.counter + 1)
}
}
// contains your mutations
export const mutations = {
setCounter(state, value){
state.counter = value
}
}
// your root getters
export const getters = {
myGetter(state){ return state.counter + 1000}
}
方法 2:根名称space,每个 Intent 一个文件
如果您的商店代码有点太大,您可以有意拆分您的商店!只需删除您的 index.js 并为状态、动作、突变和吸气剂创建文件。 Nuxt 会自动将它们构建为根名称 space 中的一个商店。从上面的示例中,我们只需要将每个部分移动到它自己的文件中并使用默认值
export.
// /store/state.js
export default () => ({
counter: 0
})
// /store/actions.js
export default {
counterUp({ state, commit }){
commit('setCounter', state.counter + 1)
}
}
// /store/mutations.js
export default{
setCounter(state, val){
state.counter = val
}
}
// /store/getters.js
export default {
myGetter(state){ return state.counter + 1000}
}
方法三:名称spaced,一个文件
如果您想在您的应用中使用 namespaces,但仍需要单个文件作为 space,只需将您的单个文件命名为 namespace倒是喜欢它的内容。如果我们从方法 1 中获取 index.js 并将其命名为 cart.js,那么所有的 getter、动作、突变和状态都将位于购物车名称 space 下。 要访问名称space 中的状态,只需在状态属性.
之后使用带有名称space 名称的计算属性computed:{
counter(){
return this.$store.state.cart.counter
}
}
如果你想在名称space中执行一个动作,你可以添加名称space + 斜线 + 动作名称。
this.$store.dispatch('cart/counterUp')
方法 4:名称spaced,每个 Intent 一个文件
正如您可能已经猜到的那样,您也可以拥有一个名称spaced 商店,您的意图也可以分开!如果我们采用方法 2 并将每个文件移动到一个名为 cart 的文件夹中,它看起来像这样。