【问题标题】:How Can I edit data after on a click event on VUE using VUEX?如何使用 VUEX 在 VUE 上的点击事件后编辑数据?
【发布时间】:2019-06-23 23:32:05
【问题描述】:

我只想编辑和保存来自 json 的内容

关注下一个question 我使用深度克隆来克隆我的数据并在计算对象中进行编辑,而不是将其发送到 Vuex 上的中心对象

代码只是第一次工作,我可以编辑数据,按下编辑后它会更改数据...但是如果我再次尝试编辑...我收到错误

[Vue 警告]:观察者“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

如果我可以在保存后重新启动组件中的内容,我认为这可能会修复错误

【问题讨论】:

  • 你试过state["content"]=payload而不是Vue.set(state, "content", payload);吗?
  • 我刚刚在codesandbox.io/s/p7yppolw00 中完成了它,但仍然显示相同的错误

标签: vue.js vuex


【解决方案1】:

您正在将对象this.contentClone 保存为状态,该对象进一步与input 绑定,这使得输入能够通过v-model 直接更改您的vuex 存储,因此出现错误;一个简单的修复方法是将this.contentClone 克隆为dispatch 到vuex 状态:

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

或者 IMO 更好的解决方案是将结果作为字符串而不是使用对象来分派。查看工作示例:https://codesandbox.io/s/mmpr4745z9

【讨论】:

  • 天才!!...这解决了问题...非常感谢
猜你喜欢
  • 2020-10-05
  • 2020-10-01
  • 2019-01-13
  • 2017-12-16
  • 1970-01-01
  • 2017-11-12
  • 2021-04-05
  • 1970-01-01
  • 2013-01-27
相关资源
最近更新 更多