Vuex 突变和操作不起作用

Posted

技术标签:

【中文标题】Vuex 突变和操作不起作用【英文标题】:Vuex mutations and actions not working 【发布时间】:2018-11-30 19:54:45 【问题描述】:

我是 Vue 和 Vuex 的新手,我正在尝试弄清楚如何改变存储中的数据。

目前在我的州,默认用户名是“default”,我想将其更改为“otto”,稍后我会从数据库中获取此信息。但为了理解的目的,我只是想让它发挥作用。

此时组件已正确加载,并显示为“默认”。不存在任何错误。

store.js:

// store.js 
export default 
    state: 
        username: 'default'
    ,
    getters: 
    ,
    mutations: 
        changeUsername (state) 
            state.username = 'otto'
        
    ,
    actions: 
        changeUsername (context) 
            context.commit('changeUsername')
        
    

vue 文件:

// Basic.vue
<template>
    <div>
        <p> username </p>

    </div>
</template>

<script>
    import  mapState  from 'vuex';
    import  mapMutations  from 'vuex';
    import  mapActions  from 'vuex';


    export default 
        name: "basic",

        computed: 
            ...mapState([
                'username'
            ])
        ,
        methods: 
            ...mapMutations([
                'changeUsername'
            ]),
            ...mapActions([
                'changeUsername'
            ])
        
    
</script>

【问题讨论】:

你在哪里调用突变/动作? @ThomasKleßen 我不知道在哪里调用突变/动作,以及如何.. 【参考方案1】:

不要包含您的突变,因为它会被您的操作调用。并调用按钮点击的动作,例如:

商店:

// store.js 
export default 
    state: 
        username: 'default'
    ,
    getters: 
        username: state => state.username
    ,
    mutations: 
        setUsername (state) 
            state.username = 'otto'
        
    ,
    actions: 
        updateUsername (context) 
            context.commit('setUsername ')
        
    

组件:

// Basic.vue
<template>
    <div>
        <p> username </p>
        <button @click="updateUsername">Change!</button>
    </div>
</template>

<script>
    export default 
        name: "basic",

        computed: 
            username() 
                return this.$store.getters.username
            
        ,
        methods: 
            updateUsername() 
                this.$store.dispatch('updateUsername')
            
        
    
</script>

附加建议:在命名突变和动作时要小心。您不希望它们具有相同的名称以避免不必要的行为。我通常将我的突变命名为setXXXX,并将我的操作命名为getXXXpatchXXX,具体取决于请求的用途。

Working jsfiddle

【讨论】:

感谢您的澄清!关于命名约定,您有什么建议?这样我就知道突变和动作是相关的但名称不同? 点击按钮时我似乎遇到了这个错误 --> Uncaught TypeError: Cannot read property 'apply' of undefined at VueComponent.mappedAction (app.js:1267) at invoker (app .js:39323) 在 htmlButtonElement.fn._withTask.fn._withTask (app.js:39122) 当然...必须通过dispatch 调用操作。看看我的编辑和我的例子。我还在商店中添加了一个 getter 以不直接访问状态。 好的,非常感谢您的帮助,现在我在相应地更改所有代码时得到这个输出,用户名现在输出:“function username(state) return state.username; ”此外,当我将 getter 更改为“返回 this.$store.state.username”,它确实有效。但是,当我单击按钮时,出现错误:“未捕获的 TypeError:this.$store.dispatch 不是函数” 如果分派不可用,您的商店初始化/包含可能存在问题。尝试回到一个非常基本的工作环境,看看它失败的地方。【参考方案2】:
<template>
    <div>
        <p @click="changeUsername"> username </p>

    </div>
</template>

如果用户像这样点击 p 标签,您可以更改用户名。

【讨论】:

谢谢,但是现在我在单击按钮或 p 标签时遇到了以下错误。未捕获的类型错误:无法在 HTMLButtonElement.fn._withTask.fn._withTask (app.js:39122) 的调用程序 (app.js:39323) 处读取 VueComponent.mappedAction (app.js:1267) 处未定义的属性“应用”跨度>

以上是关于Vuex 突变和操作不起作用的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 Vuex 模块调度操作不起作用。 [vuex] 未知动作类型

注册模块中的vuex未知突变类型

使用 axios 响应中的操作改变 vuex 存储状态 - 提交不起作用

Appsync 更新和删除突变不起作用

普通数组上的中继突变不起作用

嵌套突变似乎在 Lighthouse 3.7 中不起作用