在开发一个电商类小程序时,页面数据频繁变动,比如购物车数量、用户登录状态、商品筛选条件等。如果只用 MVVM 框架的响应式机制,很容易让组件之间的数据传递变得混乱。这时候引入 Redux,能有效解决状态分散的问题。
MVVM 负责视图更新,Redux 管理全局状态
MVVM 模式通过数据绑定自动更新视图,像 Vue 或 Knockout 这类框架用起来很顺手。但当多个页面共享同一份数据时,比如用户信息在首页、个人中心、订单页都要显示,靠父子组件传参就显得累赘。Redux 提供了一个全局 store,所有组件都能订阅需要的状态,数据源唯一,更新自然统一。
实际场景:购物车状态同步
假设你正在做一个商城应用,商品列表页可以加购,顶部导航有个小红点显示购物车数量。传统做法是在 Vuex 或组件 props 里维护 cartCount,但一旦涉及本地缓存、多端同步或服务端渲染,逻辑就会变复杂。
改用 Redux 后,购物车数据交给 reducer 处理:
function cartReducer(state = { items: [], count: 0 }, action) {
switch (action.type) {
case 'ADD_TO_CART':
return { ...state, count: state.count + 1 };
case 'REMOVE_FROM_CART':
return { ...state, count: state.count - 1 };
default:
return state;
}
}
MVVM 框架(如 Vue)中可以通过监听 store 变化来触发视图更新:
const vm = new Vue({
el: '#app',
data: {
cartCount: store.getState().cart.count
},
created() {
store.subscribe(() => {
this.cartCount = store.getState().cart.count;
});
}
});
数据流向更可控
每次操作都通过 dispatch action 触发状态变更,而不是直接修改数据。这样调试时能清楚看到“谁在什么时候改了什么”。配合开发者工具,还能做时间旅行调试,这在排查用户反馈的异常状态时特别有用。
比如用户说“刚加购的商品没反应”,回放 action 记录就能发现是否 ADD_TO_CART 被正确触发,还是网络请求失败导致 reducer 没更新。
避免过度设计
不是每个项目都需要 Redux。如果只是做个简单的表单录入页面,用 MVVM 自带的 data 和 computed 完全够用。但当你发现 props 层层传递、event bus 满天飞、localStorage 手动同步的时候,就是考虑引入 Redux 的信号了。
两者结合的本质是分工明确:MVVM 管好界面怎么变,Redux 管好数据从哪来、往哪去。就像厨房里厨师专攻炒菜,配菜员负责食材准备,各司其职,出餐才快又稳。