我有一个非常奇怪的问题,因为当开发电子应用程序时,这个问题不会出现在类星体中。但是这个带有vue-cli的是令人沮丧的。
所以我有vuex状态,其中我有我的测试数据
export default function() {
return {
profile: {
avatar: null,
name: 'Thomas Smith',
contact: 'thomas.smith@bootiq.io',
branch: 'BIQ-PRAGUE',
position: 'Software Developer / UI Designer',
projects: [
{
company: 'Company',
project: 'E-Shop Platform',
role: 'Frontend Developer, Consultant'
},
{
company: 'BIQ-INTERNAL',
project: 'Skillboard',
role: 'UI Design, Project Lead'
}
],
interests: ['Frontend Applications', 'UI Design', 'Stalking random people'],
skills: [
{
name: 'Javascript',
level: 2
},
{
name: 'Vue',
level: 3
},
{
name: 'Angular',
level: 1
}
]
}
}
}现在,我有了用于编辑配置文件数据的组件
computed: {
...mapState({
stateSkillList: state => state.skill.skillList
}),
...mapGetters({
user: 'user/getUser'
})
},
mounted() {
if (this.user) {
this.data = Object.assign({}, this.data, this.user)
if (this.data.projects.length === 0) {
this.data.projects = [this.baseItems.projects]
}
if (this.data.skills.length) {
this.filterSkillList()
}
}
},现在我的问题来了。我有一些输入,其中v-model是data.name,data.contact等,一切都很好。但是,当我尝试从data.skill数组或data.projects,data.interests中添加/删除技能时,我得到
vue.esm.js?a026:628 [Vue warn]: Error in callback for watcher "function () { return this._data.$$state }": "Error: [vuex] do not mutate vuex store state outside mutation handlers."
(found in <Root>)
warn @ vue.esm.js?a026:628
logError @ vue.esm.js?a026:1893
globalHandleError @ vue.esm.js?a026:1888
handleError @ vue.esm.js?a026:1848
run @ vue.esm.js?a026:4579
update @ vue.esm.js?a026:4551
notify @ vue.esm.js?a026:739
mutator @ vue.esm.js?a026:891
handleRemoveSkill @ EditProfile.vue?05c4:306
click @ EditProfile.vue?0ae8:411
invokeWithErrorHandling @ vue.esm.js?a026:1863
invoker @ vue.esm.js?a026:2188
original._wrapper @ vue.esm.js?a026:7565
vue.esm.js?a026:1897 Error: [vuex] do not mutate vuex store state outside mutation handlers.
at assert (vuex.esm.js?2f62:90)
at Vue.store._vm.$watch.deep (vuex.esm.js?2f62:814)
at Watcher.run (vue.esm.js?a026:4577)
at Watcher.update (vue.esm.js?a026:4551)
at Dep.notify (vue.esm.js?a026:739)
at Array.mutator (vue.esm.js?a026:891)
at VueComponent.handleRemoveSkill (EditProfile.vue?05c4:306)
at click (eval at ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"6bb1df4e-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vuetify-loader/lib/loader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/EditProfile.vue?vue&type=template&id=7b259475&scoped=true& (app.js:1178), <anonymous>:414:44)
at invokeWithErrorHandling (vue.esm.js?a026:1863)
at HTMLButtonElement.invoker (vue.esm.js?a026:2188)我也不知道为什么。下面是一个简单的函数
handleAddSkill(name) {
this.data.skills.push({ name })
this.dataSkillFilteredList = this.dataSkillFilteredList.filter(item => item !== name)
this.dataSkillList = this.dataSkillFilteredList
},感谢您的点子
发布于 2020-04-29 23:23:14
您已经复制了状态,并试图更改该副本。这就是vuex警告你的原因。通过这样做,依赖于该特定vuex状态的组件将不会获得您所更新的新数据,因为您正在vuex存储之外对进行突变并编辑其副本。如果您确实想要更改状态,则应该在vuex存储中使用其突变函数进行更改,该函数将真正更新原始状态。Vuex甚至允许您直接更新vuex状态,而不需要突变函数(比如将vuex计算属性设置为v-model)。因为它还会更新原始状态(无论多么错误)。但是你这样做根本不会影响最初的vuex商店,而且vuex似乎也不喜欢这样。因此,解决方案是使用变异函数,但是如果您的数据太多而无法处理,您可以直接使用getter和setters更改计算属性(见鬼,您甚至不必使用getter和setters)。第一种方式是首选。
https://stackoverflow.com/questions/61504945
复制相似问题