Как я могу редактировать данные после события клика на VUE, используя VUEX? - PullRequest
0 голосов
/ 30 января 2019

Я просто хочу редактировать и сохранять содержимое из json

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

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

[Vue warn]: ошибка в обратном вызове для наблюдателя "function () {return this._data. $$ state}": "Ошибка: [vuex] не изменяет состояние хранилища vuex вне обработчиков мутаций."

component.js

<template>
  <div class="hello">
    <form @submit.prevent="saveForm();">
      <input type="text" v-model="contentClone.result" />
      <button type="submit">edit</button>
      <p>{{ contentClone.result }}</p>
    </form>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  data() {
    return {
      content: {},
      contentClone: {}
    };
  },

  methods: {
    saveForm(event) {
      this.$store.dispatch("UPDATE_CONTENT", this.contentClone);
    }
  },

  beforeMount() {
    this.contentClone = JSON.parse(this.contentState);
  },

  computed: {
    contentState() {
      return JSON.stringify({ ...this.$store.getters["getContent"] });
    }
  }
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1,
h2 {
  font-weight: normal;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

store.js

import {
  UPDATE_CONTENT
} from "../actions/user";
import Vue from "vue";

const state = {
  content: { result: "original content" },
  status: String,
  errorMessage: []
};

const getters = {
  getContent: state => state.content
};

const actions = {
  [UPDATE_CONTENT]: ({ commit }, payload) => {
    commit(UPDATE_CONTENT, payload);
  }
};

const mutations = {
  [UPDATE_CONTENT]: (state, payload) => {
    Vue.set(state, "content", payload);
  }
};

export default {
  state,
  getters,
  actions,
  mutations
};

Я повторил ошибку вссылка выше, https://codesandbox.io/s/p7yppolw00

Если бы я мог просто перезапустить содержимое компонента после его сохранения, я думаю, что это может исправить ошибку

1 Ответ

0 голосов
/ 30 января 2019

Вы сохраняете объект this.contentClone как состояние, которое дополнительно связано с input, и это позволяет вводу напрямую вносить изменения в ваше хранилище vuex через v-model и, следовательно, ошибку;Простым исправлением будет клон this.contentClone, когда dispatch переходит в состояние vuex:

saveForm(event) {
  this.$store.dispatch("UPDATE_CONTENT", JSON.parse(JSON.stringify(this.contentClone)));
}

Или ИМО лучшим решением будет отправка результата в виде строки вместо использования объекта.Смотрите рабочий пример: https://codesandbox.io/s/mmpr4745z9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...