可以从 'outside' Vue compute/watch 属性 吗?

Possible to compute/watch property from 'outside' Vue?

我正在努力研究 Vue 中的反应性,how/if我可以将它用于我自己的对象和其他未在 Vue 组件中声明的库的对象中的嵌套属性。

这是一个试图使用计算的 JS fiddle: http://jsfiddle.net/73r9bk2t/1/

<div id="app">
  {{item}}
</div>


var someExternalObject = { thing: 'some value' }

var vm = new Vue({
  el: '#app',
  computed: {
    item() {
      return someExternalObject.thing;
    }
  },
})

setTimeout(() => {
  someExternalObject.thing = 'new value';
  console.log(someExternalObject.thing);
}, 1000)

这是另一个尝试使用 $watch http://jsfiddle.net/73r9bk2t/2/

<div id="app">
  {{item}}
</div>

someExternalObject = { thing: 'some initial text' }

var vm = new Vue({
  el: '#app',
  computed: {
    item() {
      return someExternalObject.thing;
    }
  },
  created()
  {
    // Give the external object a scoped reference
    this.someExternalObject = someExternalObject;

    this.$watch('someExternalObject.thing', function (newVal, oldVal)
        {
            console.log("Watched:", newVal, oldVal);
        }, { deep: true, immediate: true }); 
  }
})

setTimeout(() => {
  someExternalObject.thing = 'some updated text';
  console.log(someExternalObject.thing);
}, 1000)

但似乎没有任何效果(文本输出未更新)。我开始怀疑我是否正在尝试做一些我不应该做的事情。

如果您希望将外部库集成到 Vue 中并使其响应,那么您应该考虑使用 Vue.observable。它会让你在 Vue 实例之外创建一个反应对象。

const state = Vue.observable({ count: 0 })

const Demo = {
  render(h) {
    return h('button', {
      on: { click: () => { state.count++ }}
    }, `count is: ${state.count}`)
  }
}

https://vuejs.org/v2/api/#Vue-observable

希望对您有所帮助!