javascript - Vue 和 Vuex : computed property isn't called when changing state

标签 javascript vue.js vuex

我对 Vue 和 Vuex 还很陌生,所以请耐心等待。

我想在更改 state.template 时调用计算函数 versions(),但我没有这样做。更具体地说,当 state.template.versions 更改时。

这是当 state.template.versions 更改时我想要重新渲染的组件的一部分。您还可以看到我想要调用的计算属性 versions():

    <el-dropdown-menu class="el-dropdown-menu--wide"
      slot="dropdown">
      <div v-for="version in versions"
        :key="version.id">
           ...
      </div>
    </el-dropdown-menu>
    ...
    computed: {
      ...mapState('documents', ['template', 'activeVersion']),
      ...mapGetters('documents', ['documentVersions', 'documentVersionById', 'documentFirstVersion']),
    versions () {
       return this.documentVersions.map(function (version) {
          const v = {
            id: version.id,
            name: 'Draft Version',
            effectiveDate: '',
            status: 'Draft version',
          }
          return v
        })
    },

这是 setter/getter :

  documentVersions (state) {
    return state.template ? state.template.versions : []
  },

这是操作:

  createProductionVersion (context, data) {
    return new Promise((resolve, reject) => {
      documentsService.createProductionVersion(data).then(result => {
        context.state.template.versions.push(data)  // <-- Here I'm changing state.template. I would expect versions() to be called
        context.commit('template', context.state.template)

        resolve(result)
      })

这是突变:

  template (state, template) {
    state.template = template
  },

我读到,在某些情况下,Vue 无法检测对数组所做的更改,但 .push() 似乎可以检测到。来源:https://v2.vuejs.org/v2/guide/list.html#Caveats

知道为什么当我更新context.state.template.versions时计算属性没有被调用吗?

最佳答案

问题可能来自于state.template = template。您猜对了,这是一个 react 性问题,但不是来自数组 react 性,而是来自 template 对象。

Vue 无法检测属性添加或删除。这包括影响复杂对象的属性。为此,您需要使用 Vue.set

所以你的突变应该是:

template (state, template) {
  Vue.set(state, "template", template)
},

https://v2.vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats

关于javascript - Vue 和 Vuex : computed property isn't called when changing state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63299620/

相关文章:

docker - Nginx try_files 不适用于我的 Vue 应用程序

javascript - Vue 使用 select、v-for 和 v-model 预选值

javascript - 如何使 Firefox 扩展 URL 按钮在悬停时显示字符串

php - 如何获取客户端的本地IP地址和代理服务器

javascript vuejs 对象数组在循环中仅返回一项

arrays - 多维数组、Vuex 和突变

vue.js - 如何通过 vuex 使用 v-if 隐藏段落?

unit-testing - 模拟 Vuex getter 进行单元测试会产生意想不到的结果

javascript - NodeJS 对象继承

javascript - 仅从可见的 <img> 标签中添加/删除类