【问题标题】:How can I use a vuex store in a plugin?如何在插件中使用 vuex 存储?
【发布时间】:2020-04-30 17:04:11
【问题描述】:

在我的 Vue 插件中,我在 install 期间将 Vuex 存储作为选项的一部分传递

ma​​in.ts(主项目):

import store from "./store/";

Vue.use(Camera, { store });

new Vue({
    router,
    store,
    render: h => h(AppName)
}).$mount("#app");

ma​​in.ts(在插件中):

export default {
    install(Vue, options: any) {
        var result = options.store.getters['getFeaturesList']; // result is the correct object I need

        Vue.prototype.$myStore = function() {
            return options.store;
        }

        Vue.component("camera-control", Camera);
    }
}

但是,当我尝试访问插件内部组件中的原型属性时,它告诉我Property '$myStore' does not exist on type 'Camera'

Camera.vue(在插件中)

public getFeatureList() {
    const featuresList = this.$myStore().getters["getFeaturesList"]; //error
}

我假设安装函数和组件中的实例不一样,因此为什么它给我错误,但我需要能够从插件访问主项目的商店 - 这甚至可能吗?我如何才能进入商店?

【问题讨论】:

  • 您混淆了编译和运行时错误。问题是 TypeScript 打字。这个问题甚至没有提到 TypeScript。另外,一个地方是myStore,另一个地方是$myStore,所以也应该有运行时错误。
  • @Estus Flask 感谢您指出错字,我必须在格式化问题时删除了 $。我不明白为什么这个问题应该提到 TypeScript,甚至是什么问题。可以扩展一下吗?
  • 你提到的错误是Typescript编译错误(它提到了type 'Camera',JS没有类型的概念)。这完全是 TS 问题。可以使用this['$myStore']().getters.getFeaturesList 消除错误。提供正确的类型更可取。

标签: typescript vue.js vuejs2 vuex


【解决方案1】:

“相机”类型上不存在属性“$myStore”

是 TypeScript 编译错误。这并不意味着$myStore 不能被访问,而是它没有正确输入;打字系统不知道 Vue 实例有 $myStore 属性。

正如the documentation 解释的那样,Vue 类型声明应该已经针对插件添加的新属性进行了扩展:

// plugin.d.ts
import Vue from 'vue';
import { Store } from 'vuex';

declare module 'vue/types/vue' {
  interface Vue {
    $store: Store<any>;
  }
}

plugin.d.ts 应该从输入路径自动导入或手动导入:

import "./plugin";

【讨论】:

  • 我完全不知道文档的这一部分,但这一切都很有道理,但是我已经做出了您建议的更改,但是在运行时,this.$store(并避免与我也尝试使用this.$myStore 并获得相同结果的任何现有变量始终为undefined。虽然打字有效,但当我将鼠标悬停在 Intellisense 上时,它会显示正确的类型。我可以在我的插件组件中访问this.$parent.$store - 但是访问这种被认为是不好的做法吗?
  • 是的,$parent 是一种不好的做法,并且无视更改 proto 以使属性在所有组件中可用的理由。 $myStore 应该在所有组件中都可用。如果不是,这意味着组件派生自另一个 Vue 副本或做错了什么。该问题不包含如何使用插件。请提供一种复制问题的方法。
  • 我有两个显示相同问题的示例存储库:主项目:github.com/shepherdnick/so_main 插件项目:github.com/shepherdnick/so_plugin
  • 谢谢,这是有道理的。如前所述,如果有另一个 Vue 副本,就会发生这种情况,因此 Vue.prototype 对于某些组件来说是不一样的。这个问题非常具体到您的项目是如何组织的。 "so_plugin": "file:../so_plugin" local dep 导致嵌套的 node_modules 无法进行重复数据删除,并使插件使用自己的 Vue,例如 node_modules/so_plugin/node_modules/vue。有几种方法可以正确处理未发布的 deps。尝试本地 NPM 注册表或类似 stackoverflow.com/questions/47420244
  • 我最终使用了这篇文章中描述的 webpack 配置:github.com/vuejs/vue-cli/issues/4271#issuecomment-585299391 - 需要能够开发和运行它,仅仅添加一个“peerDependencies”不足以完成整个开发环境正常工作。
猜你喜欢
  • 2021-12-03
  • 2022-01-09
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2021-01-24
  • 2019-04-28
  • 2020-03-02
  • 2020-11-17
相关资源
最近更新 更多