gpt4 book ai didi

javascript - 如何在 Vue 插件中观察对象属性

转载 作者:行者123 更新时间:2023-11-30 10:59:53 24 4
gpt4 key购买 nike

背景

考虑以下非常基本的插件:

import SomeObject from "./SomeObject";

/**
* Some Cool Plugin...
*/
export default {
install(Vue){

Vue.prototype.$someObject = Vue.observable(SomeObject);

}
}

上面的目的是注册一个在我的应用程序中 react 的对象。

问题与疑问

Vue.prototype.$someObject 包含某些需要在全局级别而非组件级别监视的属性。

有没有办法在 Vue 插件的 install 方法中将观察者附加到 Vue 实例?

请注意,我不是在寻找以下答案,我已经知道这是可以做到的,但它破坏了将代码分离到插件中的意义。全局混合也不够......

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) });

}
}

最佳答案

在 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 实例?

另一种方法是使用属性 setter 而不是 watch。想法是使用 Object.defineProperty 为您想要“观察”的属性创建一个 setter,然后将您需要的任何副作用放入 setter 中。

关于javascript - 如何在 Vue 插件中观察对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58270908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com