简单的MVVM示例 - 待办事项列表
创作时间:
作者:
@小白创作中心
简单的MVVM示例 - 待办事项列表
引用
CSDN
1.
https://m.blog.csdn.net/qq_63165460/article/details/143022976
MVVM(Model-View-ViewModel)是一种用于构建用户界面应用程序的设计模式,现常用于在桌面、移动和Web应用程序开发中。通俗地讲,它可以理解为MVC的改进版,把MVC中的V(View)的状态和行为抽象化,把视图UI与业务逻辑分开。
MVVM 核心三组件
- M:模型(Model) :对应 data 中的数据
- V:视图(View) :模板
- VM:视图模型(ViewModel) : Vue 实例对象
如下图所示结构:
模型(Model)
代表应用程序的数据和业务逻辑。Model负责数据的存储、检索和操作,但不直接与用户界面交互。
可以理解为厨房。厨房负责准备食物。厨师们(数据)知道如何制作各种菜肴(业务逻辑)。他们不直接和顾客交流,而是通过服务员来传递食物。
视图模型(ViewModel)
作为Model和View之间的桥梁,ViewModel负责转换Model中的数据,使其更适合在View中显示。ViewModel还处理用户的输入,并将这些输入转换为对Model的操作。ViewModel监听Model中数据的变化,并将这些变化通过数据绑定传递给View。
可以理解为服务员。服务员是连接厨房和餐厅的桥梁。他们从厨房(Model)获取食物,然后端给顾客(View)。同时,他们也会把顾客的需求(比如加辣、少盐)传达给厨房。服务员确保顾客的需求被正确理解和满足。
视图(View)
代表用户界面,负责向用户展示数据和接收用户的输入。View通过数据绑定与ViewModel交互,当ViewModel中的数据发生变化时,View会自动更新以反映这些变化。同时,View也可以监听用户的交互(如点击按钮),并将这些事件传递给ViewModel处理。
可以理解为餐厅。餐厅是顾客用餐的地方,相当于用户界面。顾客在这里点菜(用户输入),并享用食物(查看数据)。餐厅的服务员(View的代码)会将顾客的订单(用户操作)传递给厨房,并将做好的菜肴(数据显示)端给顾客。
数据绑定与事件绑定
图中箭头表示数据和事件的流向:
- 数据绑定:ViewModel和View之间的数据是双向绑定的,即ViewModel中的数据变化会自动更新到View,View中的用户输入也会自动更新到ViewModel。
- 事件绑定:View中的用户交互(如按钮点击)会触发ViewModel中的命令或方法,从而更新Model中的数据。
基础代码示例
app.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>简单的MVVM示例 - 待办事项列表</title>
</head>
<body>
<h2>我的待办事项</h2>
<!-- 待办事项列表 -->
<ul id="todoList"></ul>
<!-- 添加待办事项的输入框和按钮 -->
<input type="text" id="newTodo" placeholder="添加新的待办事项">
<button onclick="addTodo()">Add</button>
<script src="app.js"></script>
</body>
</html>
app.js
// Model,负责存储待办事项的数据
let todos = [];
// ViewModel,负责处理待办事项的逻辑
const todoViewModel = {
// 获取所有的待办事项
getTodos: function() {
return todos;
},
// 添加一个新的待办事项
addTodo: function(todoText) {
const newTodo = {
id: Date.now(), // 简单的ID生成方式
text: todoText,
completed: false
};
todos.push(newTodo);
}
};
// View,负责显示数据和接收用户输入
// 这个函数用来更新待办事项列表的显示
function renderTodos() {
const todosList = document.getElementById('todoList');
todosList.innerHTML = ''; // 清空现有的列表
const todos = todoViewModel.getTodos(); // 获取所有待办事项
todos.forEach(todo => {
const li = document.createElement('li');
li.textContent = todo.text;
todosList.appendChild(li);
});
}
// 当用户点击“Add”按钮时调用这个函数
function addTodo() {
const newTodoText = document.getElementById('newTodo').value;
if (newTodoText.trim()) {
todoViewModel.addTodo(newTodoText); // 添加新的待办事项
renderTodos(); // 更新待办事项列表的显示
}
document.getElementById('newTodo').value = ''; // 清空输入框
}
// 页面加载时渲染待办事项列表
document.addEventListener('DOMContentLoaded', renderTodos);
热门推荐
五花肉和梅干菜,谁才是梅菜扣肉的灵魂?
梅菜扣肉,让你秒变大厨的秘密武器!
冬季女性防护必备:N95口罩的正确佩戴指南
清真餐厅起名攻略:如何让你的品牌闪闪发光?
冬季水果之王——桔子的养生秘诀
橘子全身都是宝,中药里的“全能王”
Video2Game:革新游戏开发,重塑虚拟世界的未来
《诺斯费拉图》沉浸式体验馆三晚门票售罄,新版影片掀起恐怖片热潮
第四届北京市基础教育发展论坛召开:聚焦教育强国建设中名校长的使命担当
雷州古城:穿越千年的岭南文化瑰宝
为什么一个部门换领导后往往都面临整个部门大换血?
湖光岩:雷州半岛上的火山奇观
雷州西湖:冬日里的岭南文化瑰宝
漳州文旅崛起:1461座土楼领衔,三古特色引千万游客
广州地铁2025年将开通10条新线,首推无人驾驶技术,助力湾区交通一体化
广州地铁11号线开通:湾区首条环线,26座换乘站重塑城市交通
CIP+TPM:企业如何实现生产效率与设备管理双提升
强迫孩子吃饭?当心带来这些严重后果
强迫孩子吃饭,小心伤了娃的心
孙周兴《手与物》:触觉的艺术哲学
百合花婚礼布置指南:寓意美好,应用多样
萝卜干炖鸭肉:从食材选购到烹饪技巧全攻略
昆明机场到南站怎么去?出租车、空港快线等四种方案
昆明西客站年底开建,渝昆高铁云南段建设提速
翼城到昆明:交通路线、景点推荐及地铁换乘攻略
11亿人患高血压,社区医院这样筑牢防控线
闭眼吃饭,提升脑力的新潮流
抽象思维和逻辑思维,让你秒变职场高手
哲学书:让你秒变思维达人的秘密武器
家传秘方,滋味无穷:家庭版红烧肉的制作与传承