在所有 vue 组件实例之间共享变量
Sharing variable across all vue component instances
我正在尝试重构一些代码并将一些代码移动到混入中。但我有不同的行为。我希望在组件的所有实例之间共享一个对象。所以我写了类似下面的东西
<script>
export default {
registryManager: new RegistryManager()
}
</script>
在实例中,我是通过 this.$options.registeryManager
访问的。
现在我已将此代码移至混合器。
混音
export default {
registryManager: new RegistryManager()
}
组件
<script>
import registryManager from './mixins/registryManager';
export default {
mixins: [registryManager]
}
</script>
假设您有 2 个组件 A、B。早些时候,组件 A 的所有实例都有一个 registryManager,而组件 B 的所有实例都有一个单独的 registryManger。
使用 mixin,组件 A 和组件 B 的所有实例都共享一个注册表管理器,因为无论有多少组件使用 mixin,都只会创建一个 mixin 实例
有没有办法为每个组件创建一个 mixin 实例以获得更早的行为?
这是预期的行为。只有一个 class 实例,new RegistryManager()
在 mixin 模块中只计算一次,Vue 不知道 registryManager
需要被实例化多次。
由于组件构造函数和class实例之间存在一对一的关系,因此可以将其分配为构造函数属性。
这可以在全球范围内完成:
Object.defineProperty(Vue.prototype, 'registryManager', {
get() {
if (!this.constructor._registryManager) {
this.constructor._registryManager = new RegistryManager();
}
return this.constructor._registryManager;
}
});
class 也是通过这种方式延迟实例化的。可以放在install(Vue) {...}
里面作为插件使用。
或本地作为 mixin:
beforeCreate() {
if (!this.constructor._registryManager) {
this.constructor._registryManager = new RegistryManager();
}
this.registryManager = this.constructor._registryManager;
}
您可以在 mixin 中创建一个工厂方法,该方法需要一个 id(例如组件的名称)和 returns RegisterManager
.
的一个实例
mixin 模块必须保留从 ids 到 RegisterManager
.
实例的映射
与此类似。
const instances = {
}
export default {
getRegistryManager: (id) => {
if (!instances[id]) {
instances[id] = new RegistryManager()
}
return instances[id]
}
}
然后从您的组件中调用 getRegistryManager
。
<script>
import getRegistryManager from './mixins/registryManager';
export default {
mixins: [getRegistryManager("ComponentName")]
}
</script>
我正在尝试重构一些代码并将一些代码移动到混入中。但我有不同的行为。我希望在组件的所有实例之间共享一个对象。所以我写了类似下面的东西
<script>
export default {
registryManager: new RegistryManager()
}
</script>
在实例中,我是通过 this.$options.registeryManager
访问的。
现在我已将此代码移至混合器。
混音
export default {
registryManager: new RegistryManager()
}
组件
<script>
import registryManager from './mixins/registryManager';
export default {
mixins: [registryManager]
}
</script>
假设您有 2 个组件 A、B。早些时候,组件 A 的所有实例都有一个 registryManager,而组件 B 的所有实例都有一个单独的 registryManger。 使用 mixin,组件 A 和组件 B 的所有实例都共享一个注册表管理器,因为无论有多少组件使用 mixin,都只会创建一个 mixin 实例 有没有办法为每个组件创建一个 mixin 实例以获得更早的行为?
这是预期的行为。只有一个 class 实例,new RegistryManager()
在 mixin 模块中只计算一次,Vue 不知道 registryManager
需要被实例化多次。
由于组件构造函数和class实例之间存在一对一的关系,因此可以将其分配为构造函数属性。
这可以在全球范围内完成:
Object.defineProperty(Vue.prototype, 'registryManager', {
get() {
if (!this.constructor._registryManager) {
this.constructor._registryManager = new RegistryManager();
}
return this.constructor._registryManager;
}
});
class 也是通过这种方式延迟实例化的。可以放在install(Vue) {...}
里面作为插件使用。
或本地作为 mixin:
beforeCreate() {
if (!this.constructor._registryManager) {
this.constructor._registryManager = new RegistryManager();
}
this.registryManager = this.constructor._registryManager;
}
您可以在 mixin 中创建一个工厂方法,该方法需要一个 id(例如组件的名称)和 returns RegisterManager
.
mixin 模块必须保留从 ids 到 RegisterManager
.
与此类似。
const instances = {
}
export default {
getRegistryManager: (id) => {
if (!instances[id]) {
instances[id] = new RegistryManager()
}
return instances[id]
}
}
然后从您的组件中调用 getRegistryManager
。
<script>
import getRegistryManager from './mixins/registryManager';
export default {
mixins: [getRegistryManager("ComponentName")]
}
</script>