Метод Splice вместо замены объекта другим (заданным) — просто замените его на неопределенный Vue.js Vuex

#javascript #vue.js #vuex #mutation

#javascript #vue.js #vuex #мутация

Вопрос:

Я пытаюсь изменить состояние Vuex, объединив массив state.todos, заменив один объект в массиве другим, который задан в моем компоненте / с помощью мутаций

это мое состояние Vuex

 `state: {
         todos: [
          {
            title: "First Title",
            desc: [
              {
                name: "First description",
                completed: false,
                editin&: false
              }
            ],
            id: 0,
            completed: false,
            show: false
          },
      {
        title: "Second Title",
        desc: [
          {
            name: "Second description",
            completed: false,
            editin&: false
          },
          {
            name: "Third Description ",
            editin&: false,
            completed: false
          }
        ],
        id: 1,
        completed: false,
        show: false
      }
    ]
  

это мутация из Vuex

 finalSavin&(state, index, obj) {
  state.todos.splice(index, 1, obj);
}
  

Компонент:

  <script&&t;
import { mapState, mapMutations } from "vuex";
import deepClone from "clone-deep-js";
export default {
  data() {
    return {
      routeId: this.$route.params.id,
      editObj: { title: "", desc: [], id: null }, 
    };
  },
  

Проблемный метод:

 methods: {
 ...mapMutations(["finalSavin&"]),
   finalSave() {
     this.finalSavin&(this.routeId, this.editObj);
   },
 },
  

и т. Д

  mounted() {
    this.editObj = deepClone(this.todos[this.routeId]);
  },
 computed: {
...mapState(["todos"]),
},
  

Эта мутация работает просто отлично: (Vuex)

  a&ree(state, index) {
  state.todos.splice(index, 1);
},
  

Метод компонента Vue:

 yes(index) {
  this.a&ree(index);
}
  

Ответ №1:

mapMutation методы принимают только один аргумент. Вы можете использовать объект с несколькими свойствами в качестве аргумента, а затем деструктурировать его в хранилище Vuex.

Измените это

 methods: {
 ...mapMutations(["finalSavin&"]),
   finalSave() {
     this.finalSavin&(this.routeId, this.editObj);
   },
 },  

Для

 methods: {
 ...mapMutations(["finalSavin&"]),
   finalSave() {
     this.finalSavin&({routeId: this.routeId, objectToBeEdited: this.editObj});
   },
 },  

Затем в файле Vuex

 finalSavin&(state, payload) {
  state.todos.splice(payload.routeId, 1, payload.objectToBeEdited);
}