考虑以下非常基本的插件:
import SomeObject from "./SomeObject";
/**
* Some Cool Plugin...
*/
export default {
install(Vue){
Vue.prototype.$someObject = Vue.observable(SomeObject);
}
}
上面的目的是在我的整个应用程序中注册一个可响应的对象。
Vue.prototype.$someObject
包含某些属性,这些属性在全局级别而不是组件级别需要为watched
。
是否可以通过Vue插件的install
方法将观察者附加到Vue实例?
请注意,我不是正在寻找以下答案,我已经知道可以做到这一点,但是它使将代码分离到插件中变得毫无意义。全局mixin也不足够...
watch: {
'$someObject.foo': {
handler(value) {
console.log(value);
}
}
}
根据here概述的文档,我认为我可以按照以下方式做一些事情:
export default {
install(Vue){
Vue.prototype.$someObject = Vue.observable(SomeObject);
// I have tried all of the following:
Vue.watch(Vue.prototype.$someObject.foo, value => { console.log(value) });
Vue.$watch(Vue.prototype.$someObject.foo, value => { console.log(value) });
Vue.prototype.watch(Vue.prototype.$someObject.foo, value => { console.log(value) });
Vue.prototype.$watch(Vue.prototype.$someObject.foo, value => { console.log(value) });
Vue.watch(Vue.$someObject.foo, value => { console.log(value) });
Vue.$watch(Vue.$someObject.foo, value => { console.log(value) });
Vue.prototype.watch(Vue.$someObject.foo, value => { console.log(value) });
Vue.prototype.$watch(Vue.$someObject.foo, value => { console.log(value) });
}
}
答案 0 :(得分:3)
在Vue 2中,只有Vue实例公开watch
。当Vue 3到来时,您将有其他选择,但是现在您只能使用Vue实例。
也就是说,您可以在插件中拥有一个实例,因此应该很容易实现您想要的目标:
import Vue from 'vue';
import SomeObject from './SomeObject';
/**
* Some Cool Plugin...
*/
export default {
install (Vue) {
Vue.prototype.$someObject = Vue.observable(SomeObject);
new Vue({
watch: {
'$someObject.foo' () {
// Do something
}
}
})
}
}
此处创建的Vue实例未呈现。纯粹是为了给我们一种观看$someObject
的方式。
我知道您在问题中排除了这一点,但我真的不明白为什么。也许您不是打算专门为观看目的而创建专用的Vue实例?
一种替代方法是使用属性设置器代替watch
。可以使用Object.defineProperty
为要“监视”的属性创建一个设置器,然后将所需的任何副作用放入设置器中。