vue.js - vue + typescript içinde mapState kullanımı


Yıllar sonra vue ile çalıştıktan sonra vue+vuex+typescript ile bir uygulama yazıyorum. Kavramları anlıyorum ama çok şey değişmiş!

Vuex mapState yardımcı fonksiyonunu kullanmaya çalışırken garip bir sorunla karşılaşıyorum. animationCanvas adında bir store modülüm var:

import { Module } from 'vuex'
import { RootState } from '../types'
import { AnimationCanvasState } from './types'

const state: AnimationCanvasState = {
  frames: [],
}

export const animationCanvas: Module<AnimationCanvasState, RootState> = {
  state,
}

Ve bunu kök mağaza modülüme çekiyor ve kaydediyorum:

import { createStore, StoreOptions } from 'vuex'
import { RootState } from './types'
import { animationCanvas } from '@/store/modules/AnimationCanvas'

const store: StoreOptions<RootState> = {
  modules: {
    animationCanvas,
  },
}

Bileşende mağazayı doğrudan $store özelliğinden çekerek kullandığımda sorunsuz çalışıyor:

import { Vue, Options } from 'vue-class-component';

@Options({
    name: 'Animation Canvas',
    computed: {
        frames() {
            return this.$store.state.animationCanvas.frames;
        },
    },
})
export default class AnimationCanvas extends Vue {
...

Ama bunu mapState yardımcı fonksiyonu ile eklemeye çalıştığımda hiçbir şey alamıyorum:

import { Vue, Options } from 'vue-class-component';
import { mapState } from 'vuex';

@Options({
    name: 'Animation Canvas',
    computed: {
        ...mapState('animationCanvas', ['frames']),
    },
})
export default class AnimationCanvas extends Vue {

Ve o modülün orada olduğunu ve doğru şekilde adlandırıldığını biliyorum, kısmen $store tarzı yolda çalıştığı için, ama aynı zamanda geliştirici araçlarında görebildiğim için de:

Belgelerde etrafa bakınıyordum ama tam olarak anlayamıyorum. Fikirlerin var mı?

Cevap #1

Kodunuzda Vuex modülünüzü isim alanına aldığınızı hiçbir yerde görmüyorum. TypeScript için sözdizimini bilmiyorum ama saf JS'te şöyle yapardınız

const store = {
  modules: {
    animationCanvas: {
       namespaced: true,
       state: ...
    }
  }
}

Bunu, bileşeninizde console.log(this.$store) yaparak ve nesnenin yapısını görerek kontrol edebilirsiniz. Getters içinde şöyle bir şeyiniz olmalıdır:

getters: {
   'animationCanvas/frames': ...
}