1

我正在尝试重构一些代码并将一些代码移动到 mixin。但我得到了不同的行为。我希望在组件的所有实例之间共享一个对象。所以我写了类似下面的东西

<script>
export default {
  registryManager: new RegistryManager()
}
</script>

在这些情况下,我通过this.$options.registeryManager. 现在我已将此代码移至 mixin。

米信

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 实例每个组件以获得更早的行为?

4

2 回答 2

1

这是预期的行为。只有一个类实例,new RegistryManager()在 mixin 模块中只评估一次,Vue 不知道registryManager需要多次实例化。

由于组件构造函数和类实例之间存在一对一的关系,因此可以将其分配为构造函数属性。

这可以在全球范围内完成:

Object.defineProperty(Vue.prototype, 'registryManager', {
  get() {
    if (!this.constructor._registryManager) {
      this.constructor._registryManager = new RegistryManager();
    }

    return this.constructor._registryManager;
  }
});

该类也以这种方式延迟实例化。可以放在里面install(Vue) {...}作为插件使用。

或者在本地作为 mixin:

  beforeCreate() {
    if (!this.constructor._registryManager) {
      this.constructor._registryManager = new RegistryManager();
    }

    this.registryManager = this.constructor._registryManager;
  }
于 2020-04-05T11:49:06.593 回答
1

您可以在 mixin 中创建一个工厂方法,该方法需要一个 id(例如组件的名称)并返回一个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>
于 2020-04-05T11:57:27.533 回答