首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue mapState对象正在改变vuex状态

Vue mapState对象正在改变vuex状态
EN

Stack Overflow用户
提问于 2020-04-29 23:00:44
回答 1查看 198关注 0票数 0

我有一个非常奇怪的问题,因为当开发电子应用程序时,这个问题不会出现在类星体中。但是这个带有vue-cli的是令人沮丧的。

所以我有vuex状态,其中我有我的测试数据

代码语言:javascript
复制
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
        }
      ]
    }
  }
}

现在,我有了用于编辑配置文件数据的组件

代码语言:javascript
复制
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中添加/删除技能时,我得到

代码语言:javascript
复制
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)

我也不知道为什么。下面是一个简单的函数

代码语言:javascript
复制
handleAddSkill(name) {
  this.data.skills.push({ name })
  this.dataSkillFilteredList = this.dataSkillFilteredList.filter(item => item !== name)
  this.dataSkillList = this.dataSkillFilteredList
},

感谢您的点子

EN

回答 1

Stack Overflow用户

发布于 2020-04-29 23:23:14

您已经复制了状态,并试图更改该副本。这就是vuex警告你的原因。通过这样做,依赖于该特定vuex状态的组件将不会获得您所更新的新数据,因为您正在vuex存储之外对进行突变并编辑其副本。如果您确实想要更改状态,则应该在vuex存储中使用其突变函数进行更改,该函数将真正更新原始状态。Vuex甚至允许您直接更新vuex状态,而不需要突变函数(比如将vuex计算属性设置为v-model)。因为它还会更新原始状态(无论多么错误)。但是你这样做根本不会影响最初的vuex商店,而且vuex似乎也不喜欢这样。因此,解决方案是使用变异函数,但是如果您的数据太多而无法处理,您可以直接使用getter和setters更改计算属性(见鬼,您甚至不必使用getter和setters)。第一种方式是首选。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61504945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档