我只想编辑和保存json的内容。
在下一个question之后,我使用深度克隆来克隆我的数据,并在计算对象中进行编辑,而不是将其发送到Vuex上的中心对象。
代码第一次工作,我可以编辑数据,然后按下编辑它更改数据.但如果我再试着编辑..。我知道错误了
Vue warn:在对观察者的回调中出错“函数() {返回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中复制了错误
如果能够在保存组件后重新启动组件中的内容,我认为这可能会修复错误。
发布于 2019-01-30 16:23:27
您正在将一个对象this.contentClone保存为状态,它与input进一步绑定,这使得输入能够通过v-model直接对您的vuex存储进行更改,从而导致错误;一个简单的修复方法是在将它复制到vuex状态时克隆this.contentClone:
saveForm(event) {
this.$store.dispatch("UPDATE_CONTENT", JSON.parse(JSON.stringify(this.contentClone)));
}或者IMO,更好的解决方案是将结果作为字符串来分配,而不是使用对象。参见工作示例:https://codesandbox.io/s/mmpr4745z9
https://stackoverflow.com/questions/54444768
复制相似问题