Vuex 存储值在不提交的情况下得到更新

Posted

技术标签:

【中文标题】Vuex 存储值在不提交的情况下得到更新【英文标题】:Vuex store values getting update without comitting 【发布时间】:2021-03-04 11:44:51 【问题描述】:

我用 vue-cli 和 vuex 开始了一个笔记项目。我已经正确设置了所有内容,并且一切正常,除了当我在 vuex 存储中添加一个新注释 - 注释列表时,它会被添加,这很好,但是当我更改输入字段中的值时,我的 vuex 存储值也会在不提交任何内容的情况下更新。

这里是代码 -

<template>
    <div>
       title
        <input type="text" v-model="note.msg">
        <button v-on:click="addNote()">ADD</button>
    </div> 
</template>
<script>
module.exports =  
  data() 
    return   
       title:'Add node', 
       note: 
           msg: this.msg,
           avatar:'wolf'
        
    
  , 
  methods:  
    addNote()  
        this.$store.dispatch("updateNotes",this.note);
    
  ,  

</script>
<style scoped> 
</style>

当我在添加笔记后更改输入值时,它会在 vuex 商店以及我显示列表的其他组件中更新。

我尝试过的是 - 我没有将 note.msg 设为 v-model,而是将其更改为 msg 并且数据对象和计算属性已相应更新,它解决了我的问题 -

<template>
    <div>
       title
        <input type="text" v-model="msg">
        <button v-on:click="addNote()">ADD</button>
    </div> 
</template>
<script>
module.exports =  
  data() 
    return   
       title:'Add node', 
        msg:''
    
  , 
  methods:  
    addNote() 
        let note = 
            msg: this.msg,
            avatar:'wolf'
        ;
        this.$store.dispatch("updateNotes",note);
    
  ,  

</script>
<style scoped> 
</style>

从技术上讲,我没有任何问题,只是我无法理解这一点。我没想到会发生这种情况。我预计第二种行为不是第一种。

编辑

action.js

const updateNotes = (context, payload) => 
    context.commit('updateNotes', payload);


export default   
    updateNotes,
;

mutation.js

const updateNotes = (state, data) => 
    state.notes.push(data);


export default  
    updateNotes
;

这些是我项目中的突变和操作。

【问题讨论】:

【参考方案1】:

updateNote 动作第一次被分派时,它无意中在输入的v-model (this.note) 和Vuex 状态notes 之间创建了一个连接。

javascript 中,对象是通过 reference 传递的,这意味着当您将 JavaScript 对象分配给一个变量时,它不会重新创建一个副本,它实际上使两个变量指向同一个目的。改变一个改变另一个。 (这与 Vue/Vuex 无关,在原生 JavaScript 中也是如此。)

因此,当您将 this.note 传递给 Vuex 时,您添加的项目不是唯一的对象,它与组件中使用的完全相同。对于您添加的每个对象,它都是这样的。它们都指向输入,因为操作不断将引用传递给this.note

它没有在您的修复中发生的原因是因为您每次在 addNote 中创建一个全新的对象,然后传递它。所以它没有连接到任何东西。

如果你在 strict 模式下使用 Vuex,Vuex 会在此抛出错误:

错误:[vuex] 不在突变处理程序之外改变 vuex 存储状态。

定义商店时可以开启strict mode:

const store = new Vuex.Store(
  strict: true,  // Turning on strict mode
  state: 
    note: null
  

【讨论】:

以上是关于Vuex 存储值在不提交的情况下得到更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有本地存储的情况下将 JWT 令牌存储在 VueX 中

如何在不推送到服务器的情况下更新中继存储

Vuex-页面在提交状态更改后未更新

VueX:为啥 vuex 存储数据不更新组件数据属性?

如何在不推动我的情况下从GitHub中提取更改?

如何在不更改实时数据库中的 downloadUrl 的情况下更新 android 中 Firebase 存储中的位图图像