前后端数据同步

前后端数据同步

#tech / dev / frontend #type / howto #status / growing

[!info] related notes

1. 直接更新本地数据

直接在修改服务器中数据后也同步修改本地数据,避免了请求,减少了服务器的压力

// 在 handleRemoveSavedAccount 方法中
const handleRemoveSavedAccount = async (username: string) => {
    try {
        const response = await sharedDataService.removeSavedAccountInfo(username);
        if (response.success) {
            // 直接更新本地状态,无需重新请求
            authStore.setSavedAccounts(
                authStore.savedAccounts.filter(acc => acc.username !== username)
            );
            snackbar.message = "账号记录已删除";
            snackbar.color = "success";
        } else {
            snackbar.message = response.message || "删除失败";
            snackbar.color = "error";
        }
        snackbar.show = true;
    } catch (error) {
        console.error("删除账号记录失败:", error);
        snackbar.message = error instanceof Error ? error.message : "删除失败";
        snackbar.color = "error";
        snackbar.show = true;
    }
};

2. 重新获取数据

对服务器压力增大,数据大时,请求时间长,也影响用户体验
强一致性

const handleRemoveSavedAccount = async (username: string) => {
    try {
        const response = await sharedDataService.removeSavedAccountInfo(username);
        if (response.success) {
            // 重新获取所有数据
            const newResponse = await sharedDataService.getAllSavedAccountInfo();
            if (newResponse.success && Array.isArray(newResponse.data)) {
                authStore.setSavedAccounts(newResponse.data);
            }
            snackbar.message = "账号记录已删除";
            snackbar.color = "success";
        } else {
            // ...error handling
        }
    } catch (error) {
        // ...error handling
    }
};

3. 使用响应式状态管理

相当于方法1 直接更新本地数据
修改被多个组件依赖的数据时,可以响应式更新所有前端页面

// stores/authStore.ts
export const useAuthStore = defineStore('auth', {
    state: () => ({
        savedAccounts: [] as SavedAccount[],
        // ...other state
    }),
    actions: {
        setSavedAccounts(accounts: SavedAccount[]) {
            this.savedAccounts = accounts;
        },
        removeSavedAccount(username: string) {
            this.savedAccounts = this.savedAccounts.filter(
                acc => acc.username !== username
            );
        },
        async deleteAccount(username: string) {
            const response = await sharedDataService.removeSavedAccountInfo(username);
            if (response.success) {
                this.removeSavedAccount(username);
                return true;
            }
            return false;
        }
    }
});

4. 使用发布订阅模式

解耦了前端数据更新与后端数据更新
很好的跨组件实现

// eventBus.ts
import mitt from 'mitt';

type Events = {
    'account:removed': string;
    'accounts:updated': SavedAccount[];
};

export const eventBus = mitt<Events>();

// 在组件中使用
onMounted(() => {
    eventBus.on('account:removed', updateAccounts);
});

onUnmounted(() => {
    eventBus.off('account:removed', updateAccounts);
});
创建于 2025/1/1 更新于 2026/5/27