Vuex/Electron/typescript - 反应性不适用于 getter

问题描述

  • 首先,感谢您的帮助。

我正在处理一个 Electron/vuejs/typescript 项目,现在我遇到了一个问题。 Vuex 模块 getter 的反应性接缝不起作用。我已经安装了 vue-dev-tools,突变已经正确完成,但是我的 vue 组件 getter 没有随着 vue 状态的突变而更新。这是我的代码我的组件


<template>
    <div>
        <b-row>
            <b-col>
                <b-form-group
                    label="Niveau"
                    label-for="level-choise"
                >

                <b-dropdown v-if="level" id="level-choise" block split variant="light" :text="level.name"  >
                    <b-dropdown-item @click="classroomModule.selectLevel(l)" v-for="(l,index) in levels()" :key="index" >{{l}}</b-dropdown-item>
                </b-dropdown>

                </b-form-group>
            </b-col>

            <b-col>
                <b-form-group
                    label="Serie"
                    label-for="serie-choise"
                >

                <b-dropdown v-if="serie" id="serie-choise" block split variant="light" :text="serie.name">
                    <b-dropdown-item @click="classroomModule.selectSerie(s)" v-for="(s,index) in series" :key="index"  >{{s}}</b-dropdown-item>
                </b-dropdown>

                </b-form-group>
            </b-col>

            <b-col>
                <b-form-group
                    label="Classe"
                    label-for="classroom-choise"
                >

                <b-dropdown v-if="classroom" id="classroom-choise" split variant="light" block="true" :text="classroom.name">
                    <b-dropdown-item @click="classroomModule.selectClassroom(c)" v-for="(c,index) in classrooms" :key="index"  >{{c}}</b-dropdown-item>
                </b-dropdown>

                </b-form-group>
            </b-col>
            
        </b-row>
        <b-row class="border border-light">
            <b-col>
                {{classroom}}
            </b-col>
        </b-row>
    </div>
</template>

<script lang="ts" >

import { getModule } from "vuex-module-decorators";

import { Vue,Component } from "vue-property-decorator";
import ClassroomModule from "@/Store/modules/Classroom.module";
import { Classroom } from "@/models/school/Classroom";
import { Serie } from "@/models/school/Serie";
import { Level } from "@/models/school/Level";



@Component
export default class ChooseClassroom extends Vue {

    classroomModule : ClassroomModule
    constructor(){
        super();
        this.classroomModule =  Object.assign(new ClassroomModule(this.$store),getModule(ClassroomModule,this.$store));
        this.classroomModule.getLevels();
        
            console.log("Choose Classroom Mounted!");

        setTimeout(()=>{
            console.log("Component Level : ",this.level);
            console.log("Component Serie : ",this.serie);
            console.log("Component CLassroom : ",this.classroom);

            console.log("Component Levels : ",this.levels);
            console.log("Component Series : ",this.series);
            console.log("Component CLassrooms : ",this.classrooms);
        },30000)
    }
    
    
    public get classrooms() : Classroom[] {
        console.log("Getter classrooms : ",this.classroomModule.classrooms);
        
        return this.classroomModule.classrooms;
    }

    
    public get series() : Serie[] {
        console.log("Getter series : ",this.classroomModule.series);

        return this.classroomModule.series;
    }

    
    public  get levels() : Level[] {
        console.log("Getter levels : ",this.classroomModule.levels);
        return this.classroomModule.levels;
    }
    

    
    public get level() : Level {
        console.log("Getter level : ",this.classroomModule.level);
        return this.classroomModule.level;
    }

    
    public get serie() : Serie {
        console.log("Getter serie : ",this.classroomModule.serie);

        return this.classroomModule.serie
    }
    
    
    public get classroom() : Classroom {
        console.log("Getter classroom : ",this.classroomModule.classroom);
        return this.classroomModule.classroom;
    }
    
    
    
    
}

</script>

<style>

</style>

这是我的 Vuex 模块

import { Action,Module,Mutation,VuexModule } from "vuex-module-decorators";

import { Classroom } from "@/models/school/Classroom";
import { Serie } from "@/models/school/Serie";
import { Level } from "@/models/school/Level";
import { Event } from "electron/renderer";


const { ipcRenderer } = window.require("electron");


@Module({
    name : "classroom",namespaced : true,})
export default class ClassroomModule extends VuexModule {
    
    private _classrooms : Classroom[] = [];
    private _series : Serie[] = [];
    private _levels : Level[] = [];

    private _level! : Level;
    private _serie! : Serie;
    private _classroom! : Classroom;

    
    public get level() : Level {
        //console.log("2 Level = ",this._level);

        return this._level;
    }

    
    public get serie() : Serie {
        return this._serie
    }

    
    public get classroom() : Classroom {
        return this._classroom
    }
    

    public get classrooms() : Classroom[] {
        return this._classrooms;
    }

    @Mutation
    public  setClassrooms(c : Classroom[]) {
        this._classrooms = c;
    }


    public get series() : Serie[] {
        return this._series;
    }

    @Mutation
    public  setSeries(s: Serie[]) {
        this._series = s;
    }


    public get levels() : Level[] {
        return this._levels;
    }

    @Mutation
    public  setLevels(l : Level[]) {
        this._levels = l;
    }
    

    @Mutation
    public  setLevel(l : Level) {
        this._level = l;
     
    }
    @Mutation
    public  setSerie(s : Serie) {
        this._serie = s;
    }
    @Mutation
    public  setClassroom(c : Classroom) {
        this._classroom = c;
    }
    

    @Action

    public selectLevel(level : Level) {
        console.log("Select Levels !");

        
        this.context.commit("setLevel",level);
        //this.();
        this.context.dispatch("getSeries");

    }

    @Action

    public selectSerie(serie : Serie) {
        console.log("Select serie !");

        this.context.commit("setSerie",serie);
        //this.();
        this.context.dispatch("getClassrooms");

    }

    @Action

    public selectClassroom(classroom : Classroom) {
        console.log("Select classroom !");

        this.context.commit("setClassroom",classroom);
        //this.();

    }


    @Action

    public getLevels() {
        console.log("Get Levels !");
        
        ipcRenderer.send ("module:classroom:levels:get");

        ipcRenderer.on("module:classroom:levels:got",( event : Event,levels: Level[])=>{
            levels = Level.from(levels)
            this.context.commit("setLevels",levels )
            this.context.dispatch("selectLevel",levels[0] )
            //this.selectLevel(levels[0]);

        })

        
    }

    @Action
 
    public getSeries() {
        console.log("Get series !");

        ipcRenderer.send ("module:classroom:series:get",this.level);

        ipcRenderer.on("module:classroom:series:got",(event : Event,series: Serie[])=>{
            series = Serie.from(series)
            this.context.commit("setSeries",series )
            this.context.dispatch("selectSerie",series[0] )

        })
    }
    @Action

    public getClassrooms() {
        console.log("Get Classrooms !");

        ipcRenderer.send ("module:classroom:classrooms:get",this.serie);

        ipcRenderer.on("module:classroom:classrooms:got",classrooms: Classroom[])=>{
            classrooms = Classroom.from(classrooms)
            this.context.commit("setClassrooms",classrooms )
            this.context.dispatch("selectClassroom",classrooms[0] )

        })
    }
    
    
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)