vue.js - 绑定(bind)到 getter 的计算属性在从 Vuex 状态对象中按键删除项目时不会更新

标签 vue.js vuex

请问我们如何在 Vuex 状态对象中通过键删除项目,并且仍然让绑定(bind)到 getter 的计算属性自动更新?

我有一个简单的商店:

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 dev-tools 中验证这一点,但我的 vue 组件中的计算属性看不到更新:

...
  computed: {
    admins: this.$store.getters('admins'),
    managers: this.$store.getters('managers'),
    counters: this.$store.getters('counters')
  },

最佳答案

正如其他人在评论中所说,如果您仅使用 obj.newProperty = 1,Vue 无法检测属性的添加或删除。或obj['newProperty'] = 1delete obj.unwantedProperty 。您需要使用Vue.setVue.delete如此处所述https://v2.vuejs.org/v2/api/#Vue-set

原因是,当你通过改变一个对象的值来修改它的现有属性时,你是通过该属性的setter方法进行修改的,并且在setter方法中,Vue会通知所有该改变的东西(组件、计算属性等) “取决于”此属性,以更新自身。

例如,如果您有 vm.a = 1并且您有一个名为 b 的计算属性和b评估如下 vm.a + 1 ,然后我们说 b取决于a根据需要a来得出它的值(value)。当你改变 a喜欢 vm.a = 2 ,你隐式调用a的setter方法,这个方法会通知b更新。

但是,如果您删除某个属性(不使用 Vue.delete ),则不会调用其 setter ,并且该属性依赖项将不会收到通知,因此它们不会自行更新。

一些额外的故事 - Vue 如何知道什么取决于什么? 使用我们之前的示例,当 Vue 初始化时,它将为其数据创建 getter 和 setter。在本例中,它为 vm.a 创建 getter 和 setter。 。 然后 Vue 尝试评估 b ,并记住,bvm.a + 1 。期间b的评价,我们会调用vm.a ,事实上,我们正在调用 vm.a的 getter 方法。在这个 getter 方法中,我们知道 b的评价依据vm.a我们注册ba的依赖性。

关于vue.js - 绑定(bind)到 getter 的计算属性在从 Vuex 状态对象中按键删除项目时不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51860793/

相关文章:

javascript - 如何修复无法安装组件: template or render function not defined in vue

javascript - 将 vuex 的状态传递给图表 - vue

javascript - VUEX,当$store.state为null时怎么办

javascript - Vue.js:在@click-Method中获取当前 `v-for` Objekt

npm - 将 browserify 工作流程移至 gulp 任务 [vueify、browserify、babelify]

javascript - 如何使用 vue/Quasar 进行日期范围验证

vue.js - Vuejs - 如何在点击时进行 v-for 循环

javascript - Typescript/Vue - 当我为 Prop 声明默认对象时,如何访问 vuex 存储?

javascript - Firestore 特定数据读取不适用于变量,但适用于静态值

vue.js - Vue Router Child,尾部斜杠