VueJS:手动触发对观察到的对象/数组的更新

Ifn*_*not 3 observer-pattern vue.js

我创建了一个vue对象来进行数据反应:

let vm = new Vue({
  data () {
    return {
      myData: {}
    }
  },
  watch: {
    myData (value) {
      console.log('changed')
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

当我将/推入/编辑/删除到时vm.myData,一切正常,监视者将其发送给我changed

现在,我只想通过“触摸”(没有数据版本)来获取changed事件。我可以为此调用观察者的内部方法吗? vm.myData

Ifn*_*not 10

好的,我有解决方案。

我们可以notify()从附加的观察器触发该方法:

vm.myData.__ob__.dep.notify()
Run Code Online (Sandbox Code Playgroud)

当vuejs修补原始方法以使数据具有响应性时,我从源头找到了它。

https://github.com/vuejs/vue/blob/dev/src/core/observer/array.js#L42

  • 我想知道为什么你会想以这种方式这样做。对我来说,这一切似乎都是一大代码味道。 (2认同)
  • 好的,我解释一下原因。我正在为 Vuex 和 Laravel Eloquent 数据同步构建服务。当后端发生某些事情时,数据在前端发生了变化,它工作正常,但问题出在缓存系统上:当我知道某些事情发生了变化但并非真的因为缓存(页面发生变化)而发生变化时,我需要通知读者用于刷新组件的数据。 (2认同)

Jac*_*Goh 6

因为它是一个对象(对象通过引用传递,而不是通过值传递),所以可以这样做

vm.myData = Object.assign({},vm.myData);
Run Code Online (Sandbox Code Playgroud)

这会创建一个具有完全相同值的新对象,但它是一个新对象,因此会触发观察者。

https://codepen.io/jacobgoh101/pen/RQeLoM?editors=1011