[sduoj] Vuex グローバル状態管理

2021SC@SDUSC

序文

前回のブログでは、Vuex とその使用法について簡単に紹介しました。このブログでは、 sduojプロジェクトでの Vuex の使用状況をその場で分析します。

【sduoj】Vuexを初めて知る

store.js

メンテナンスを容易にするために、Vuex用のjs ファイル、store.js を特別に作成し、 srcディレクトリに配置します。
その中で、まずVueVuexを紹介します:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

次に、特定のstoreを書くことができます:

// 实例化一个 Vuex.Store 对象,并将其作为默认项导出
export default new Vuex.Store({
    
    
	state: {
    
    
		token: null, // 用户身份鉴权使用的JWT
		isTeacher: false,
		isAdmin: false,
		myInfo: {
    
    
			avatar: null,
			nickname: null,
            realName: null,
            stuNum: null,
            userId: undefined,
            username: null,
		},
		problemSetInfo: {
    
    
            problems: [],
            title: "",
            announcement: "",
            author: "",
            open: undefined,
            beginTime: "1970-01-01",
            endTime: "1970-01-01",
            status: 0,
            isMyProblemSet: false,
            problemIds: [],
            problemSetId: 0,
        }
	},
	mutations: {
    
    
        setToken(state, token) {
    
    
            state.token = token
        },
        setNoToken(state, noToken) {
    
    
            state.noToken = noToken;
        },
        setIsTeacher(state, isTeacher) {
    
    
            state.isTeacher = isTeacher;
        },
        setIsAdmin(state, isAdmin) {
    
    
            state.isAdmin = isAdmin;
            state.isTeacher = isAdmin;
        },
        setMyInfo(state, myInfo) {
    
    
            for (const key in myInfo) {
    
    
                Vue.set(state.myInfo, key, myInfo[key])
            }
        },
        setProblemSetInfo(state, newInfo) {
    
    
            for (const key in newInfo) {
    
    
                Vue.set(state.problemSetInfo, key, newInfo[key])
            }
        },
    },
    actions: {
    
    
        setToken(context, token) {
    
    
            context.commit('setToken', token);
        },
        setNoToken(context, noToken) {
    
    
            context.commit('setNoToken', noToken);
        },
        setIsTeacher(context, isTeacher) {
    
    
            context.commit('setIsTeacher', isTeacher);
        },
        setIsAdmin(context, isAdmin) {
    
    
            context.commit('setIsAdmin', isAdmin);
        },
        setMyInfo(context, myInfo) {
    
    
            context.commit('setMyInfo', myInfo);
        },
        setProblemSetInfo(context, newInfo) {
    
    
            context.commit('setProblemSetInfo', newInfo);
        },
    },
    getters: {
    
    
        usernameToShow: (state) => {
    
    
            return state.myInfo.nickname ? state.myInfo.nickname : (state.myInfo.realName ? state.myInfo.realName : state.myInfo.username)
        }
    },
})

プロジェクトのインポート

これで使用できる store.js ができたので、公式に使用する前にそれをプロジェクトにインポートする必要があります。
プロジェクトのmain.jsで:

/*
 * src/main.js
 */

import Vue from 'vue'
import App from './App.vue'
import store from './store';

new Vue({
    
    
    store,
    render: h => h(App)
}).$mount('#app')

その他

Vuex でパフォーマンスを改善する

sduoj がhttp リクエストを送信するときの認証方法は、JWT 文字列をサーバーに提供することです。これは、ユーザーのログイン時に使用されlocalStorage.setItem、ディスクに保存されlocalStorage.getItem、ディスクを取り出します。明らかに、リクエストを送信するたびにディスクから JWT を読み取る必要がある場合、1 回の操作のオーバーヘッドは短期的には小さいように見えますが、その効率は低いに違いありません。したがって、JWT をディスクから取り出して、プロジェクトの開始時またはユーザーのログイン時に Vuex に保存することもできます。このようにして、リクエストを送信するたびに必要なデータを Vuex から読み取るだけで済みます。メモリにアクセスする効率は、ディスク データを繰り返し読み取るパフォーマンスよりも明らかに高くなります。

おすすめ

転載: blog.csdn.net/qq_53126706/article/details/121843204