【问题标题】:Typescript/Vue - How can I get access to the vuex store when I'm declaring a default object for a prop?Typescript/Vue - 当我为道具声明默认对象时,如何访问 vuex 存储?
【发布时间】:2019-11-27 18:07:04
【问题描述】:

在我的 Vue-Typescript 项目中,我声明了一个名为“data”的道具,并且对于这个道具,我还想将一个对象结构定义为默认值。有些字段是多语言的,为此我需要访问 vuex 商店,它将返回用户已激活的所有活动语言。这允许我动态生成字段。有谁知道我该如何实现这一目标?

export default class CompanyForm extends Vue {

    public dialog = false;

    @Prop({default: {
        name: '',
        address: this.$store.state.Language.data.getLanguageDataStructure(),
        telephone: '',
        fax: '',
        email: '',
        website: ''
    }})
    data: object;
});

【问题讨论】:

  • 只是一个建议。因此,假设您将该对象传递给组件。为什么不将整个对象设置在 store 状态中。让组件访问状态成员。会干净很多吗?
  • @JeremyWalters 您可以在此处看到的对象是组件。我只是没有粘贴属于它的 HTML 代码。当我在商店状态中定义默认属性时,我必须将组件验证、属性等从默认属性中分离出来,这似乎不是一个好的解决方案,因为状态本身必须在组件内声明为独立于每次初始化

标签: javascript typescript vue.js vuex


【解决方案1】:

您唯一的选择是手动导入 store 并使用它而不是 this.$store,因为在计算 prop 的默认值时组件不会被实例化。

请注意,在创建组件实例之前会验证 props,因此实例属性(例如数据、计算等)在默认或验证器函数中不可用。

(请参阅Vue Props,向上滚动一点以查看警告)

如果您的默认值是对象或数组,您还应该使用函数作为默认值,否则您的所有实例将共享相同的默认值。 (参见Vue Prop ValidationpropE 示例)

这样的事情应该可以工作:

import store from 'path/to/your/store';

export default class CompanyForm extends Vue {

    public dialog = false;

    @Prop({default: () => ({
        name: '',
        address: store.state.Language.data.getLanguageDataStructure(),
        telephone: '',
        fax: '',
        email: '',
        website: ''
    })})
    data: object;
});

【讨论】:

  • 好的,这对我来说很有意义,这个解决方案会起作用。显然我忘记了也可以直接导入商店。 ^^ 我要在晚上尝试这个解决方案。感谢默认功能的提示,不知道它会这样。感谢您的帮助:)
  • @ProV 是的,vue 文档没有很好地指出这些边缘情况 :) 抱歉,如果打字稿不是 100% 正确,我上次使用它已经有一段时间了;)
  • 没问题,实现还是看懂了^^
猜你喜欢
  • 1970-01-01
  • 2019-04-08
  • 2020-04-28
  • 1970-01-01
  • 2020-06-15
  • 2021-07-15
  • 1970-01-01
  • 2021-06-06
  • 2021-12-12
相关资源
最近更新 更多