如何修复Vuex中未知突变类型的错误?

ome*_*erS 9 javascript vue.js

我已经用谷歌搜索了这个错误,但是我得到的答案对我没有帮助。我正在尝试使用 Vuex 进行喜欢/不喜欢计数。我正在使用 jsonplaceholder 来获取数据。在这里,我获取数据并为所有对象设置类似的属性。

actions: {
async fetchPhotos({commit}) {
      const response = await axios.get('https://jsonplaceholder.typicode.com/photos');
      commit('setPhotos', response.data.splice(0,100))
    },
}

mutations: {
setPhotos: (state, photos) => {
      (state.albumList = photos);
      state.albumList.forEach(element => element.likes = 0)}
}
Run Code Online (Sandbox Code Playgroud)

在我的 dom 之后,我想使用一个按钮表示不喜欢,使用另一个按钮表示喜欢。我想在单击按钮时显示类似计数器。

<div v-for="photos in allPhotos" :key="photos.id">
        <div class="card" @click="detail(photos)"><img :src="photos.thumbnailUrl" alt=""></div>
        <div class="likes">
          <div class="myButton" ><button class="red" @click="minus(photos.id)"><i class="fas fa-minus"></i></button></div>
          <div>{{photos.likes}}</div>
          <div class="myButton "><button class="green" @click="plus(photos.id)"><i class="fas fa-plus"></i></button></div>
        </div>
</div>
Run Code Online (Sandbox Code Playgroud)

所以我在我的商店和脚本中添加了减突变。

methods: {
    ...mapMutations(['minus']),
Run Code Online (Sandbox Code Playgroud)
state: {
    albumList : [],
  },

mutations: {
    minus: (state, id) => {
      state.albumList[id-1].likes--
   },
Run Code Online (Sandbox Code Playgroud)

毕竟,我遇到了一个错误:

[vuex] 未知突变类型:减号。

我看不出我在这里做错了什么。

PS:我还修剪了代码以使其更清晰。

Joh*_*hhn 11

我已经这样了大约12个小时了。使用 vuex 4.0.1。经过大量谷歌搜索后,针对一些最常见的原因,我对上述问题得出以下结论:

常见问题 为什么可能会发生这种情况

  1. 对此不确定,但这是建议之一,版本(这发生在版本 2 之间的某个地方)。我认为这不再是问题
  2. 第二,也是最重要的,命名:
  • 如果使用命名空间模块,请确保为模块添加前缀,例如this.$store.commit('moduleName/myMutation');
  • 在模块中命名您的mutations, 。actions只需确认并确保拼写正确
  • 对于命名空间模块,请确保namespaced: true在其中添加。

实际上,后者是我将我的设置为namespace: true而不是之后的问题namespaced: true


小智 4

这是工作示例。还要仔细检查您的 vuex 商店配置/注册。

const store = new Vuex.Store({
    state: {
        items: [
            {
                title: "item1",
                likes: 10
            },
            {
                title: "item2",
                likes: 24
            }
        ]
    },
    actions: {
        like({ commit }, id) {
            commit("LIKE_ITEM", id);
        },
        dislike({ commit }, id) {
            commit("DISLIKE_ITEM", id);
        }
    },
    mutations: {
        LIKE_ITEM(state, id) {
            state.items[id].likes++;
        },
        DISLIKE_ITEM(state, id) {
            state.items[id].likes--;
        }
    },
    getters: {
        items(state) {
            return state.items;
        }
    }
});

new Vue({
    el: "#app",
    store,
    computed: {
        items() {
            return this.$store.getters.items;
        }
    },
    data: () => {
        return {};
    },
    methods: {
        like(id) {
            this.$store.dispatch("like", id);
        },
        dislike(id) {
            this.$store.dispatch("dislike", id);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.5.1/vuex.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id='app'>
    <div v-for='(item, i) in items' :key="i">
        {{item.title }}: {{item.likes}} likes
        <button @click='like(i)'>Like +</button> <button @click='dislike(i)'>Dislike -</button>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)