代码之家  ›  专栏  ›  技术社区  ›  Charles Okwuagwu

绑定到getter的计算属性在按键从Vuex状态对象中删除项时不会更新

  •  0
  • Charles Okwuagwu  · 技术社区  · 6 年前

    我有一个简单的商店:

    const state {
      users: {} // object of objects keyed by userid
    }
    
    const getters {
      admins: state => Object.values(state.users).filter(o => o.role === 'administrator'),
      managers: state => Object.values(state.users).filter(o => o.role === 'manager'),
      counters: state => Object.values(state.users).filter(o => o.role === 'counter'),
    }
    
    const mutations {
      DELETE_USER (state, userid) {
        delete state.users[userid] // the user id deleted, i can verify this in dev-tools
      }
    }
    

    用户已被删除,我可以在vue开发工具中进行验证,但vue组件中的计算属性看不到更新:

    ...
      computed: {
        admins: this.$store.getters('admins'),
        managers: this.$store.getters('managers'),
        counters: this.$store.getters('counters')
      },
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Wang Sheng    6 年前

    正如其他人在注释中所述,如果仅使用 obj.newProperty = 1 obj['newProperty'] = 1 delete obj.unwantedProperty Vue.set Vue.delete https://vuejs.org/v2/api/#Vue-set

    原因是,当通过改变其值来修改对象的现有属性时,通过属性的SETTER方法进行修改,并且在SETTER方法中,VUE将通知“取决于”此属性的所有事物(组件、计算属性等),以更新自身。

    例如,如果你有 vm.a = 1 你有一个计算属性叫做 b 被评估为 vm.a + 1 取决于 a 根据需要 提出它的价值。当你改变 喜欢 vm.a = 2 更新。

    删除Vue ),您不会调用它的setter,并且此属性依赖项不会得到通知,因此它们不会自我更新。

    一些额外的故事-Vue怎么知道什么取决于什么? 使用前面的示例,当Vue初始化时,它将为其数据创建getter和setter。在本例中,它为 vm.a . ,记住, . 在 我们会打电话给 ,事实上,我们正在打电话 虚拟机 的getter方法。在这个getter方法中,我们知道 虚拟机 我们登记 作为 的依赖关系。

        2
  •  0
  •   mickaelw    6 年前

    Vuex提供帮助程序 mapGetters : ( https://vuex.vuejs.org/guide/getters.html#the-mapgetters-helper )

    computed: {
      ...mapGetters([
         'admins',
         'managers',
         'counters'
      ])
    }
    

    之后,您可以像在HTML模板中计算一样使用它:

    {{ admins }}
    

    或者在组件脚本中:

    this.admins