【问题标题】:Vuex doesn't detect actions or mutations but detects getters fineVuex 不检测动作或突变,但检测 getter 很好
【发布时间】:2021-12-26 05:41:21
【问题描述】:

我正在尝试在我的 Vue 应用中设置 Vuex。

app.js

require('./bootstrap');

window.Vue = require('vue').default;

import Vuex from "vuex";
Vue.use(Vuex);
import storeData from "./store";

const store = new Vuex.Store(
   storeData
)

Vue.component('home', require('./components/Home.vue').default);


const app = new Vue({
    el: '#app',
    store
});

store.js

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export const state = {
    members: [],
};

export const getters = {
    members: state => () => {
        return state.members;
    }
};

export const actions = {
    async getMembers({ commit, state, dispatch }){
        const res = await this.$axios.get('getMembers');
        const { data } = await res;
        commit('setMembers', data);
    }   
};

export const mutations = {
    setMembers(state, members){
        state.members = members;
    },
};

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

首页.vue

<template>
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">
                <div class="card">
                    <div class="card-header">Home</div>

                    <div class="card-body">
                        {{ members }}
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
import { mapGetters, mapActions, mapMutations } from "vuex";
    export default {
        mounted() {
            this.getMembers();
        },
        computed: {
        ...mapGetters({
            members: 'members'
        })
        },
        methods: {
            ...mapActions({
            getMembers: 'getMembers'
        })
        }
    }
</script>

主页显示“成员”getter 的问题。我在开发人员工具中将其视为一个空数组,如果我将其设置为其他任何内容,它将显示它。但是,如果我尝试进行突变,它不会检测到动作或突变。例如,动作说:“[vuex] 未知动作类型:getMembers”知道是什么原因造成的吗?

【问题讨论】:

    标签: javascript vue.js vuex


    【解决方案1】:

    store 用new Vuex.Store 初始化了两次,第二次为构造函数提供了 store 实例,这导致了一个 bug。

    从 store.js 导出的是 store,而不是 store data

    可以是:

    const store = new Vuex.Store({
      state,
      getters,
      actions,
      mutations
    });
    
    export default store;
    

    那么很明显就是store.js导出的store实例了。

    Vue.use(Vuex) 也被调用了两次,这可能不会导致除了警告之外的问题,因为 Vue 插件通常包含防止多次初始化的保护措施。 store.js 不需要包含它,在应用入口点初始化插件是很常见的。

    这是一个潜在的错误:

    require('./bootstrap');
    
    window.Vue = require('vue').default;
    
    import Vuex from "vuex";
    ...
    

    根据规范提升导入,此行为取决于设置,但不应期望此代码将按此顺序进行评估。

    需要:

    import './bootstrap';
    import Vue from "vue";    
    import Vuex from "vuex";
    import store from "./store";
    
    window.Vue = Vue;
    ...
    

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2021-02-03
      • 2012-01-23
      • 2012-05-31
      • 2019-10-07
      • 2017-01-10
      相关资源
      最近更新 更多