Значения хранилища Vuex получают обновление без отправки

#javascript #vue.js #vuex

#javascript #vue.js #vuex

Вопрос:

Я начал проект создания заметок с помощью vue-cli и vuex. Я все настроил правильно, и все работает нормально, кроме того, когда я добавляю новую заметку в vuex store — notelist, она добавляется, и это нормально, но когда я меняю значение в поле ввода, мое значение хранилища 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 действие отправляется в первый раз, оно непреднамеренно создает соединение между input v-model ( this.note ) и состоянием Vuex notes .

В JavaScript объекты передаются по ссылке, что означает, что когда вы присваиваете переменной объект JavaScript, он не создает новую копию, фактически обе переменные указывают на один и тот же точный объект. Изменение одного меняет другое. (Это не имеет ничего общего с Vue / Vuex и верно для ванильного JavaScript.)

Поэтому, когда вы переходите this.note к Vuex, добавленный вами элемент не является уникальным объектом, он точно такой же, который используется в компоненте. И так будет для каждого добавляемого вами объекта. Все они указывают на входные данные, потому что действие продолжает передавать ссылку this.note .

Причина, по которой этого не происходит в вашем исправлении, заключается в том, что вы каждый раз создаете совершенно новый объект addNote и передаете его. Так что это ни к чему не связано.

Если бы вы использовали Vuex в strict режиме mode, Vuex выдал бы ошибку при этом:

Ошибка: [vuex] не изменяет состояние хранилища vuex вне обработчиков мутаций.

Вы можете включить strict режим при определении хранилища:

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