Vuex 和 vue-property-decorator 与 $store 的反应性

Posted

技术标签:

【中文标题】Vuex 和 vue-property-decorator 与 $store 的反应性【英文标题】:Vuex and vue-property-decorator reactivity with $store 【发布时间】:2019-09-08 21:01:55 【问题描述】:

我正在尝试在我的@Component 上使用 vuex $store。但它不是被动的:/

示例:

import  Component, Vue  from 'vue-property-decorator';

  @Component
  export default class Internationalize extends Vue 

    protected selectedLanguage: any = this.$store.getters['globalLocale'];

    private langages = this.$store.getters['globalLanguages'];

    protected switchLanguage(locale: any) 
      if (locale !== this.selectedLanguage.locale) 
        const newLanguage = this.langages.find((lang: any) => lang.locale === locale);
        this.$store.dispatch('updateLocale', newLanguage);
      
    
  

this.$store.dispatch('updateLocale', newLanguage); 状态 globalLanguages 将被更改,但我的变量 selectedLanguage 不是反应性的..

谢谢

编辑:工作得很好

import  Component, Vue  from 'vue-property-decorator';
  import  mapGetters  from 'vuex';

  @Component(
    computed: 
      ...mapGetters(
        selectedLanguage: 'globalLocale',
        langages: 'globalLanguages'
      )
    
  )
  export default class Internationalize extends Vue 

    protected selectedLanguage!: any;
    protected langages!: any;

    protected flag = this.$store.getters.globalLocale.flagSuffix;

    protected switchLanguage(locale: any) 
      if (locale !== this.selectedLanguage.locale) 
        const newLanguage = this.langages.find((lang: any) => lang.locale === locale);
        this.$store.dispatch('updateLocale', newLanguage).then(() => 
          this.$i18n.locale = locale;
          this.$i18n.setLocaleMessage(this.$i18n.locale, this.$store.getters.globalTranslations);
          this.$i18n.fallbackLocale = process.env.VUE_APP_DEFAULT_LOCALE;
        );
      
    
  

【问题讨论】:

您是否在控制台中遇到任何错误 【参考方案1】:

这是因为selectedLanguage 不是计算属性/getter,所以它的值仅在类实例化时分配,而不是在以后更新商店的globalLocale 时分配。

第一个解决方案是简单地将您的 selectedLanguage 转换为组件本身的计算属性(又名 getter):

protected get selectedLanguage() 
    return this.$store.getters['globalLocale'];

或者,你也可以use mapGetters in the @Component decorator instead:

@Component(
    computed: 
        ...mapGetters(
            selectedLanguage: 'globalLocale'
        )
    
)

但是,这样做的问题是您在第二种解决方案中失去了类型安全性,如果您愿意,您必须在组件本身中声明为 selectedLanguage 返回的类型,即:

@Component(
    computed: 
        ...mapGetters(
            selectedLanguage: 'globalLocale'
        )
    
)
export default class Internationalize extends Vue 
    protected selectedLanguage!: <YourTypeHere>

【讨论】:

以上是关于Vuex 和 vue-property-decorator 与 $store 的反应性的主要内容,如果未能解决你的问题,请参考以下文章

Vue+TypeScript项目实践(一)

vue-property-decorator用法介绍

如何使用 ts 和 vue-property-decorator 热重载组件

Vue 3 + vue-property-decorator 的“超级表达式必须为 null 或函数”

无故获取解析错误 Typescript, Vue, vue-property-decorator, VSCode

使用 vue-property-decorator 时注册本地组件