Skip to content

JavaScript状态管理演进2024:前端开发者掌握MVC到MVVM架构模式完整指南

📊 SEO元描述:2024年最新JavaScript状态管理演进教程,详解MVC、MVP、MVVM模式、单向数据流、状态机概念。包含完整架构对比分析,适合前端开发者快速掌握现代状态管理思想。

核心关键词:JavaScript状态管理2024、MVC模式、MVVM架构、单向数据流、状态机概念、前端架构模式

长尾关键词:JavaScript状态管理怎么选择、MVC和MVVM区别、单向数据流是什么、状态机如何实现、前端架构模式对比


📚 JavaScript状态管理演进学习目标与核心收获

通过本节JavaScript状态管理演进教程,你将系统性掌握:

  • MVC架构模式:理解Model-View-Controller的设计思想和实现原理
  • MVP架构模式:掌握Model-View-Presenter的改进机制和应用场景
  • MVVM架构模式:深入理解Model-View-ViewModel的双向绑定原理
  • 单向数据流:掌握现代前端框架的核心数据流管理思想
  • 状态机概念:理解状态机在复杂应用状态管理中的重要作用
  • 架构演进历程:了解前端状态管理从传统到现代的发展脉络

🎯 适合人群

  • 前端开发工程师的架构设计能力提升需求
  • 全栈开发者的前端状态管理技术学习
  • 技术团队负责人的架构选型决策参考
  • 计算机专业学生的软件架构模式学习

🌟 状态管理是什么?为什么需要架构模式?

状态管理是什么?这是前端开发者最关心的问题。状态管理是指在应用程序中管理和维护数据状态的方法和策略,也是现代前端开发的核心技术之一。

状态管理的核心价值

  • 🎯 数据一致性:确保应用中的数据状态在各个组件间保持同步
  • 🔧 可预测性:让状态变化遵循明确的规则,便于调试和维护
  • 💡 可扩展性:支持复杂应用的状态管理需求,便于功能扩展
  • 📚 可测试性:清晰的状态管理逻辑便于编写单元测试
  • 🚀 开发效率:规范化的状态管理提升团队开发协作效率

💡 架构选择建议:选择合适的状态管理架构模式是项目成功的关键,需要根据项目规模、团队技术栈和业务复杂度综合考虑。

MVC架构模式:传统三层架构的经典设计

**MVC(Model-View-Controller)**是最经典的软件架构模式,将应用程序分为三个核心组件:

javascript
// 🎉 MVC架构模式示例
// Model - 数据模型
class UserModel {
    constructor() {
        this.users = [];
        this.observers = [];
    }
    
    // 添加观察者
    addObserver(observer) {
        this.observers.push(observer);
    }
    
    // 通知观察者
    notifyObservers() {
        this.observers.forEach(observer => observer.update());
    }
    
    // 添加用户
    addUser(user) {
        this.users.push(user);
        this.notifyObservers();
    }
    
    // 获取所有用户
    getUsers() {
        return this.users;
    }
}

// View - 视图层
class UserView {
    constructor(model) {
        this.model = model;
        this.model.addObserver(this);
    }
    
    // 渲染用户列表
    render() {
        const users = this.model.getUsers();
        const userList = document.getElementById('userList');
        userList.innerHTML = users.map(user => 
            `<li>${user.name} - ${user.email}</li>`
        ).join('');
    }
    
    // 观察者更新方法
    update() {
        this.render();
    }
}

// Controller - 控制器
class UserController {
    constructor(model, view) {
        this.model = model;
        this.view = view;
        this.initEventListeners();
    }
    
    // 初始化事件监听
    initEventListeners() {
        const addButton = document.getElementById('addUser');
        addButton.addEventListener('click', () => {
            this.handleAddUser();
        });
    }
    
    // 处理添加用户
    handleAddUser() {
        const nameInput = document.getElementById('userName');
        const emailInput = document.getElementById('userEmail');
        
        const user = {
            name: nameInput.value,
            email: emailInput.value
        };
        
        this.model.addUser(user);
        
        // 清空输入框
        nameInput.value = '';
        emailInput.value = '';
    }
}

// 初始化MVC应用
const userModel = new UserModel();
const userView = new UserView(userModel);
const userController = new UserController(userModel, userView);

MVC模式的核心特点

  • Model(模型):负责数据管理和业务逻辑处理
  • View(视图):负责用户界面的展示和用户交互
  • Controller(控制器):负责协调Model和View,处理用户输入

MVP架构模式:改进的展示层模式

**MVP(Model-View-Presenter)**是MVC的改进版本,通过Presenter来完全隔离View和Model:

javascript
// 🎉 MVP架构模式示例
// Model保持不变
class TaskModel {
    constructor() {
        this.tasks = [];
    }
    
    addTask(task) {
        this.tasks.push({
            id: Date.now(),
            text: task,
            completed: false
        });
    }
    
    toggleTask(id) {
        const task = this.tasks.find(t => t.id === id);
        if (task) {
            task.completed = !task.completed;
        }
    }
    
    getTasks() {
        return this.tasks;
    }
}

// View接口定义
class TaskViewInterface {
    displayTasks(tasks) {
        throw new Error('displayTasks method must be implemented');
    }
    
    clearInput() {
        throw new Error('clearInput method must be implemented');
    }
    
    getInputValue() {
        throw new Error('getInputValue method must be implemented');
    }
}

// View实现
class TaskView extends TaskViewInterface {
    constructor() {
        super();
        this.presenter = null;
    }
    
    setPresenter(presenter) {
        this.presenter = presenter;
        this.initEventListeners();
    }
    
    initEventListeners() {
        const addButton = document.getElementById('addTask');
        addButton.addEventListener('click', () => {
            this.presenter.addTask();
        });
        
        document.addEventListener('click', (e) => {
            if (e.target.classList.contains('task-toggle')) {
                const taskId = parseInt(e.target.dataset.id);
                this.presenter.toggleTask(taskId);
            }
        });
    }
    
    displayTasks(tasks) {
        const taskList = document.getElementById('taskList');
        taskList.innerHTML = tasks.map(task => `
            <div class="task ${task.completed ? 'completed' : ''}">
                <span>${task.text}</span>
                <button class="task-toggle" data-id="${task.id}">
                    ${task.completed ? '取消完成' : '标记完成'}
                </button>
            </div>
        `).join('');
    }
    
    clearInput() {
        document.getElementById('taskInput').value = '';
    }
    
    getInputValue() {
        return document.getElementById('taskInput').value;
    }
}

// Presenter - 展示器
class TaskPresenter {
    constructor(model, view) {
        this.model = model;
        this.view = view;
        this.view.setPresenter(this);
        this.updateView();
    }
    
    addTask() {
        const taskText = this.view.getInputValue();
        if (taskText.trim()) {
            this.model.addTask(taskText);
            this.view.clearInput();
            this.updateView();
        }
    }
    
    toggleTask(id) {
        this.model.toggleTask(id);
        this.updateView();
    }
    
    updateView() {
        const tasks = this.model.getTasks();
        this.view.displayTasks(tasks);
    }
}

// 初始化MVP应用
const taskModel = new TaskModel();
const taskView = new TaskView();
const taskPresenter = new TaskPresenter(taskModel, taskView);

MVP模式的优势

  • 🎯 完全解耦:View和Model完全分离,通过Presenter通信
  • 🎯 易于测试:可以独立测试Presenter逻辑
  • 🎯 灵活性高:可以轻松替换View或Model的实现

💼 实际应用场景:MVP模式特别适合需要支持多种UI实现的应用,如同时支持Web和移动端的应用。

MVVM架构模式:双向绑定的现代化架构

**MVVM(Model-View-ViewModel)**是现代前端框架广泛采用的架构模式,通过数据绑定实现View和ViewModel的自动同步:

javascript
// 🎉 MVVM架构模式示例
// Model - 数据模型
class ProductModel {
    constructor() {
        this.products = [
            { id: 1, name: 'iPhone 15', price: 7999, quantity: 10 },
            { id: 2, name: 'MacBook Pro', price: 15999, quantity: 5 },
            { id: 3, name: 'iPad Air', price: 4599, quantity: 8 }
        ];
    }

    getProducts() {
        return this.products;
    }

    updateQuantity(id, quantity) {
        const product = this.products.find(p => p.id === id);
        if (product) {
            product.quantity = quantity;
        }
    }

    addProduct(product) {
        product.id = Math.max(...this.products.map(p => p.id)) + 1;
        this.products.push(product);
    }
}

// ViewModel - 视图模型(实现响应式数据绑定)
class ProductViewModel {
    constructor(model) {
        this.model = model;
        this.data = this.createReactiveData();
        this.view = null;
    }

    // 创建响应式数据
    createReactiveData() {
        const data = {
            products: this.model.getProducts(),
            newProduct: {
                name: '',
                price: 0,
                quantity: 0
            },
            totalValue: 0
        };

        // 使用Proxy实现响应式
        return new Proxy(data, {
            set: (target, property, value) => {
                target[property] = value;
                this.notifyView();
                this.updateComputedProperties();
                return true;
            }
        });
    }

    // 绑定视图
    bindView(view) {
        this.view = view;
        this.updateComputedProperties();
        this.notifyView();
    }

    // 通知视图更新
    notifyView() {
        if (this.view) {
            this.view.render(this.data);
        }
    }

    // 更新计算属性
    updateComputedProperties() {
        this.data.totalValue = this.data.products.reduce(
            (total, product) => total + (product.price * product.quantity), 0
        );
    }

    // 添加产品
    addProduct() {
        if (this.data.newProduct.name && this.data.newProduct.price > 0) {
            this.model.addProduct({...this.data.newProduct});
            this.data.products = this.model.getProducts();

            // 重置表单
            this.data.newProduct = {
                name: '',
                price: 0,
                quantity: 0
            };
        }
    }

    // 更新产品数量
    updateProductQuantity(id, quantity) {
        this.model.updateQuantity(id, quantity);
        this.data.products = this.model.getProducts();
    }
}

// View - 视图层
class ProductView {
    constructor(viewModel) {
        this.viewModel = viewModel;
        this.viewModel.bindView(this);
        this.initEventListeners();
    }

    // 渲染视图
    render(data) {
        this.renderProductList(data.products);
        this.renderTotalValue(data.totalValue);
        this.renderForm(data.newProduct);
    }

    // 渲染产品列表
    renderProductList(products) {
        const productList = document.getElementById('productList');
        productList.innerHTML = products.map(product => `
            <div class="product-item">
                <h3>${product.name}</h3>
                <p>价格: ¥${product.price}</p>
                <div class="quantity-control">
                    <label>数量: </label>
                    <input type="number"
                           value="${product.quantity}"
                           data-id="${product.id}"
                           class="quantity-input"
                           min="0">
                </div>
                <p>小计: ¥${product.price * product.quantity}</p>
            </div>
        `).join('');
    }

    // 渲染总价值
    renderTotalValue(totalValue) {
        const totalElement = document.getElementById('totalValue');
        totalElement.textContent = `总价值: ¥${totalValue}`;
    }

    // 渲染表单
    renderForm(newProduct) {
        document.getElementById('productName').value = newProduct.name;
        document.getElementById('productPrice').value = newProduct.price;
        document.getElementById('productQuantity').value = newProduct.quantity;
    }

    // 初始化事件监听
    initEventListeners() {
        // 产品数量变化
        document.addEventListener('input', (e) => {
            if (e.target.classList.contains('quantity-input')) {
                const id = parseInt(e.target.dataset.id);
                const quantity = parseInt(e.target.value) || 0;
                this.viewModel.updateProductQuantity(id, quantity);
            }
        });

        // 表单输入双向绑定
        document.getElementById('productName').addEventListener('input', (e) => {
            this.viewModel.data.newProduct.name = e.target.value;
        });

        document.getElementById('productPrice').addEventListener('input', (e) => {
            this.viewModel.data.newProduct.price = parseFloat(e.target.value) || 0;
        });

        document.getElementById('productQuantity').addEventListener('input', (e) => {
            this.viewModel.data.newProduct.quantity = parseInt(e.target.value) || 0;
        });

        // 添加产品
        document.getElementById('addProduct').addEventListener('click', () => {
            this.viewModel.addProduct();
        });
    }
}

// 初始化MVVM应用
const productModel = new ProductModel();
const productViewModel = new ProductViewModel(productModel);
const productView = new ProductView(productViewModel);

MVVM模式的核心特点

  • 双向数据绑定:View和ViewModel之间的数据自动同步
  • 声明式编程:通过数据驱动视图更新,而非命令式操作DOM
  • 计算属性:自动计算依赖数据的派生值
  • 响应式系统:数据变化自动触发相关更新

单向数据流:现代前端的核心理念

单向数据流是React、Vue等现代框架采用的数据管理模式,数据只能从父组件流向子组件:

javascript
// 🎉 单向数据流示例
class Store {
    constructor() {
        this.state = {
            count: 0,
            todos: []
        };
        this.listeners = [];
    }

    // 订阅状态变化
    subscribe(listener) {
        this.listeners.push(listener);
        return () => {
            const index = this.listeners.indexOf(listener);
            this.listeners.splice(index, 1);
        };
    }

    // 获取当前状态
    getState() {
        return this.state;
    }

    // 派发动作
    dispatch(action) {
        this.state = this.reducer(this.state, action);
        this.listeners.forEach(listener => listener());
    }

    // 状态归约器
    reducer(state, action) {
        switch (action.type) {
            case 'INCREMENT':
                return { ...state, count: state.count + 1 };
            case 'DECREMENT':
                return { ...state, count: state.count - 1 };
            case 'ADD_TODO':
                return {
                    ...state,
                    todos: [...state.todos, {
                        id: Date.now(),
                        text: action.payload,
                        completed: false
                    }]
                };
            case 'TOGGLE_TODO':
                return {
                    ...state,
                    todos: state.todos.map(todo =>
                        todo.id === action.payload
                            ? { ...todo, completed: !todo.completed }
                            : todo
                    )
                };
            default:
                return state;
        }
    }
}

// 组件基类
class Component {
    constructor(store) {
        this.store = store;
        this.unsubscribe = store.subscribe(() => this.render());
    }

    render() {
        throw new Error('render method must be implemented');
    }

    destroy() {
        this.unsubscribe();
    }
}

// 计数器组件
class Counter extends Component {
    constructor(store, element) {
        super(store);
        this.element = element;
        this.render();
        this.bindEvents();
    }

    render() {
        const state = this.store.getState();
        this.element.innerHTML = `
            <div class="counter">
                <h2>计数器: ${state.count}</h2>
                <button id="increment">+1</button>
                <button id="decrement">-1</button>
            </div>
        `;
    }

    bindEvents() {
        this.element.addEventListener('click', (e) => {
            if (e.target.id === 'increment') {
                this.store.dispatch({ type: 'INCREMENT' });
            } else if (e.target.id === 'decrement') {
                this.store.dispatch({ type: 'DECREMENT' });
            }
        });
    }
}

// 待办事项组件
class TodoList extends Component {
    constructor(store, element) {
        super(store);
        this.element = element;
        this.render();
        this.bindEvents();
    }

    render() {
        const state = this.store.getState();
        this.element.innerHTML = `
            <div class="todo-list">
                <h2>待办事项</h2>
                <input type="text" id="todoInput" placeholder="添加新任务">
                <button id="addTodo">添加</button>
                <ul>
                    ${state.todos.map(todo => `
                        <li class="${todo.completed ? 'completed' : ''}">
                            <span>${todo.text}</span>
                            <button data-id="${todo.id}" class="toggle-todo">
                                ${todo.completed ? '取消完成' : '标记完成'}
                            </button>
                        </li>
                    `).join('')}
                </ul>
            </div>
        `;
    }

    bindEvents() {
        this.element.addEventListener('click', (e) => {
            if (e.target.id === 'addTodo') {
                const input = this.element.querySelector('#todoInput');
                if (input.value.trim()) {
                    this.store.dispatch({
                        type: 'ADD_TODO',
                        payload: input.value
                    });
                    input.value = '';
                }
            } else if (e.target.classList.contains('toggle-todo')) {
                const id = parseInt(e.target.dataset.id);
                this.store.dispatch({
                    type: 'TOGGLE_TODO',
                    payload: id
                });
            }
        });
    }
}

// 初始化应用
const store = new Store();
const counterElement = document.getElementById('counter');
const todoElement = document.getElementById('todoList');

const counter = new Counter(store, counterElement);
const todoList = new TodoList(store, todoElement);

单向数据流的优势

  • 🎯 可预测性:数据流向清晰,状态变化可追踪
  • 🎯 调试友好:便于定位问题和进行时间旅行调试
  • 🎯 测试简单:纯函数式的状态更新易于测试

状态机概念:精确控制状态转换

**状态机(State Machine)**是一种数学模型,用于描述系统在不同状态之间的转换规则:

javascript
// 🎉 状态机实现示例
class StateMachine {
    constructor(config) {
        this.states = config.states;
        this.transitions = config.transitions;
        this.currentState = config.initial;
        this.context = config.context || {};
        this.listeners = [];
    }

    // 订阅状态变化
    subscribe(listener) {
        this.listeners.push(listener);
        return () => {
            const index = this.listeners.indexOf(listener);
            this.listeners.splice(index, 1);
        };
    }

    // 触发事件
    send(event, payload = {}) {
        const transition = this.transitions[this.currentState]?.[event];

        if (!transition) {
            console.warn(`No transition for event "${event}" in state "${this.currentState}"`);
            return;
        }

        // 执行守卫条件检查
        if (transition.guard && !transition.guard(this.context, payload)) {
            console.warn(`Guard condition failed for transition "${event}"`);
            return;
        }

        // 执行退出动作
        const currentStateConfig = this.states[this.currentState];
        if (currentStateConfig.onExit) {
            currentStateConfig.onExit(this.context, payload);
        }

        // 执行转换动作
        if (transition.action) {
            transition.action(this.context, payload);
        }

        // 更新状态
        const previousState = this.currentState;
        this.currentState = transition.target;

        // 执行进入动作
        const nextStateConfig = this.states[this.currentState];
        if (nextStateConfig.onEntry) {
            nextStateConfig.onEntry(this.context, payload);
        }

        // 通知监听器
        this.listeners.forEach(listener => {
            listener({
                previousState,
                currentState: this.currentState,
                event,
                payload,
                context: this.context
            });
        });
    }

    // 获取当前状态
    getState() {
        return this.currentState;
    }

    // 获取上下文
    getContext() {
        return this.context;
    }

    // 检查是否可以执行某个事件
    can(event) {
        return !!this.transitions[this.currentState]?.[event];
    }
}

// 订单状态机示例
const orderStateMachine = new StateMachine({
    initial: 'pending',
    context: {
        orderId: null,
        amount: 0,
        paymentMethod: null,
        attempts: 0
    },
    states: {
        pending: {
            onEntry: (context) => {
                console.log('订单创建中...');
            }
        },
        confirmed: {
            onEntry: (context) => {
                console.log(`订单 ${context.orderId} 已确认`);
            }
        },
        paid: {
            onEntry: (context) => {
                console.log(`订单 ${context.orderId} 支付成功`);
            }
        },
        shipped: {
            onEntry: (context) => {
                console.log(`订单 ${context.orderId} 已发货`);
            }
        },
        delivered: {
            onEntry: (context) => {
                console.log(`订单 ${context.orderId} 已送达`);
            }
        },
        cancelled: {
            onEntry: (context) => {
                console.log(`订单 ${context.orderId} 已取消`);
            }
        },
        failed: {
            onEntry: (context) => {
                console.log(`订单 ${context.orderId} 处理失败`);
            }
        }
    },
    transitions: {
        pending: {
            CONFIRM: {
                target: 'confirmed',
                action: (context, payload) => {
                    context.orderId = payload.orderId;
                    context.amount = payload.amount;
                }
            },
            CANCEL: {
                target: 'cancelled'
            }
        },
        confirmed: {
            PAY: {
                target: 'paid',
                guard: (context, payload) => {
                    return payload.amount === context.amount;
                },
                action: (context, payload) => {
                    context.paymentMethod = payload.method;
                }
            },
            CANCEL: {
                target: 'cancelled'
            }
        },
        paid: {
            SHIP: {
                target: 'shipped',
                action: (context, payload) => {
                    context.trackingNumber = payload.trackingNumber;
                }
            },
            REFUND: {
                target: 'cancelled',
                action: (context) => {
                    console.log('处理退款...');
                }
            }
        },
        shipped: {
            DELIVER: {
                target: 'delivered'
            },
            RETURN: {
                target: 'cancelled',
                action: (context) => {
                    console.log('处理退货...');
                }
            }
        },
        delivered: {
            // 最终状态,无转换
        },
        cancelled: {
            // 最终状态,无转换
        },
        failed: {
            RETRY: {
                target: 'pending',
                guard: (context) => {
                    return context.attempts < 3;
                },
                action: (context) => {
                    context.attempts++;
                }
            }
        }
    }
});

// 使用状态机
orderStateMachine.subscribe((transition) => {
    console.log(`状态转换: ${transition.previousState} -> ${transition.currentState}`);
    console.log('当前上下文:', transition.context);
});

// 模拟订单流程
orderStateMachine.send('CONFIRM', { orderId: 'ORD-001', amount: 299.99 });
orderStateMachine.send('PAY', { amount: 299.99, method: 'credit_card' });
orderStateMachine.send('SHIP', { trackingNumber: 'TRK-123456' });
orderStateMachine.send('DELIVER');

状态机的应用场景

  • 用户界面状态:登录流程、表单验证、模态框状态
  • 业务流程:订单处理、审批流程、游戏状态
  • 网络请求:加载、成功、失败、重试状态
  • 动画控制:播放、暂停、停止、循环状态

状态机的优势

  • 🎯 状态明确:每个状态都有明确的定义和行为
  • 🎯 转换可控:状态转换遵循预定义的规则
  • 🎯 易于调试:状态变化过程清晰可追踪
  • 🎯 可视化:可以用图表直观展示状态转换

📚 JavaScript状态管理演进学习总结与下一步规划

✅ 本节核心收获回顾

通过本节JavaScript状态管理演进的学习,你已经掌握:

  1. MVC架构模式:理解了传统三层架构的设计思想和实现方式
  2. MVP架构模式:掌握了通过Presenter实现View和Model完全解耦的方法
  3. MVVM架构模式:深入理解了双向数据绑定和响应式编程的核心原理
  4. 单向数据流:学会了现代前端框架的数据管理模式和实现方法
  5. 状态机概念:掌握了精确控制复杂状态转换的数学模型和实际应用

🎯 状态管理架构下一步

  1. 深入学习Flux架构:理解Facebook提出的单向数据流架构思想
  2. 掌握Redux模式:学习可预测的状态容器和中间件机制
  3. 探索响应式编程:深入理解依赖收集和变化通知系统
  4. 实践状态管理库:在实际项目中应用Vuex、MobX等状态管理解决方案

🔗 相关学习资源

  • MVC模式详解:深入理解经典架构模式的设计原理
  • MVVM框架对比:Vue.js、Angular等框架的MVVM实现差异
  • 状态机库推荐:XState、Robot等专业状态机库的使用
  • 响应式编程指南:RxJS等响应式编程库的学习资源

💪 实践建议

  1. 重构现有项目:将传统的DOM操作代码重构为MVC或MVVM模式
  2. 实现简单状态机:为表单验证或用户界面状态创建状态机
  3. 对比不同模式:在同一个功能上分别使用MVC、MVP、MVVM实现
  4. 性能测试:比较不同架构模式在复杂应用中的性能表现

🔍 常见问题FAQ

Q1: MVC、MVP、MVVM三种模式该如何选择?

A: 选择依据项目复杂度和团队技术栈:MVC适合简单应用,MVP适合需要多平台支持的应用,MVVM适合数据驱动的复杂交互应用。现代前端框架多采用MVVM模式。

Q2: 单向数据流相比双向绑定有什么优势?

A: 单向数据流提供更好的可预测性和调试体验,数据变化路径清晰,便于状态管理和错误追踪。双向绑定虽然开发便捷,但在复杂应用中可能导致数据流混乱。

Q3: 什么时候需要使用状态机?

A: 当应用有复杂的状态转换逻辑时,如多步骤表单、游戏状态、业务流程等。状态机能确保状态转换的正确性和完整性,避免非法状态的出现。

Q4: 响应式编程和传统事件驱动有什么区别?

A: 响应式编程是声明式的,关注数据的变化和依赖关系;传统事件驱动是命令式的,需要手动处理事件和更新。响应式编程能自动处理复杂的依赖更新。

Q5: 如何在现有项目中引入状态管理架构?

A: 建议渐进式重构:先识别核心数据和状态,然后选择合适的架构模式,逐步将相关功能迁移到新架构中,最后统一整个应用的状态管理方式。


🛠️ 架构选型指南

项目规模评估

小型项目(< 10个页面)

javascript
// 推荐:简单的MVC模式
// 问题:过度设计
// 解决:使用原生JavaScript + 简单的观察者模式

class SimpleStore {
    constructor() {
        this.data = {};
        this.listeners = [];
    }

    set(key, value) {
        this.data[key] = value;
        this.notify(key, value);
    }

    get(key) {
        return this.data[key];
    }

    subscribe(listener) {
        this.listeners.push(listener);
    }

    notify(key, value) {
        this.listeners.forEach(listener => listener(key, value));
    }
}

中型项目(10-50个页面)

javascript
// 推荐:MVVM模式 + 状态管理库
// 问题:状态分散,难以维护
// 解决:使用Vue.js + Vuex 或 React + Context API

// Vue.js MVVM示例
const store = new Vuex.Store({
    state: {
        user: null,
        products: []
    },
    mutations: {
        SET_USER(state, user) {
            state.user = user;
        },
        SET_PRODUCTS(state, products) {
            state.products = products;
        }
    },
    actions: {
        async fetchUser({ commit }, userId) {
            const user = await api.getUser(userId);
            commit('SET_USER', user);
        }
    }
});

大型项目(> 50个页面)

javascript
// 推荐:微前端 + 独立状态管理
// 问题:状态管理复杂,性能问题
// 解决:模块化状态管理 + 状态机

// Redux + Redux-Saga示例
const rootReducer = combineReducers({
    user: userReducer,
    products: productsReducer,
    orders: ordersReducer
});

const store = createStore(
    rootReducer,
    applyMiddleware(sagaMiddleware)
);

"掌握状态管理架构的演进历程,是成为优秀前端架构师的必经之路。从MVC到MVVM,从双向绑定到单向数据流,每一次演进都是为了更好地管理复杂应用的状态。"