做前端开发时,经常遇到页面逻辑越来越复杂,改一处功能,另一处莫名其妙出问题。尤其在团队协作中,有人改了数据绑定,没通知其他人,结果界面显示错乱,查半天才发现是 ViewModel 和 View 之间的通信出了岔子。这时候,用好 MVVM 模式,能少踩很多坑。
数据流向要单向,别搞双向绑定滥用
MVVM 的核心是数据驱动视图。View 层只负责展示,所有状态来自 ViewModel。实际项目里,有些人图省事,直接在 View 里修改数据源,导致状态混乱。比如在 Vue 里用了太多 v-model 绑定到深层对象,某个子组件一改,父级状态也变了,调试时根本不知道源头在哪。
正确的做法是:View 只派发事件,ViewModel 接收后处理逻辑,再更新状态。这样数据流向清晰,出问题顺着事件和状态变更一步步查就行。
ViewModel 别变成大杂烩
有人把所有接口请求、表单校验、甚至 DOM 操作都塞进 ViewModel,结果一个文件几百行,改个按钮颜色都要翻半天。这其实违背了 MVVM 的初衷。
应该把业务逻辑拆出去,ViewModel 只管“状态+行为”的暴露。比如用户登录逻辑,可以单独写一个 useAuth.js,ViewModel 引入后调用方法即可。这样既方便测试,也便于复用。
善用计算属性,减少手动更新
页面上常有“已选中数量”“总价计算”这类动态值。如果每次都在事件回调里手动计算并更新 DOM,很容易漏掉某些触发场景。用计算属性就能自动响应依赖变化。
const viewModel = {
items: [/* 商品列表 */],
get selectedCount() {
return this.items.filter(item => item.selected).length;
},
get totalPrice() {
return this.items
.filter(item => item.selected)
.reduce((sum, item) => sum + item.price, 0);
}
};
只要 items 变化,这两个值自动更新,View 层绑定后无需额外操作。
错误处理别丢给控制台
网络请求失败时,很多人只在 console.log 打印错误,用户点按钮没反应,以为卡了。MVVM 的优势是可以把错误状态也纳入数据流。
const viewModel = {
loading: false,
error: null,
async fetchData() {
this.loading = true;
this.error = null;
try {
const res = await fetch('/api/data');
this.data = await res.json();
} catch (err) {
this.error = '数据加载失败,请稍后重试';
} finally {
this.loading = false;
}
}
};
View 层根据 error 字段决定是否显示提示信息。这样异常情况也能被追踪,配合日志上报,排错效率高很多。
调试时打开状态快照
Chrome 插件如 Vue Devtools 能直接看到当前 ViewModel 的所有状态。上线前模拟各种边界情况,比如空数据、网络超时、重复提交,观察状态是否正确流转。如果发现 loading 一直为 true,说明 finally 块没执行,可能是 Promise 漏处理。
平时多看看状态变化的轨迹,比打断点一行行跑代码快得多。就像修水管,知道哪段有漏水,才能精准换零件。