前言
Hi,我是Aben,连夜更新第二集,欢迎Star---》源代码仓库
- 首先需要声明的一个点,在前端的MV模块与后端的MV模块是不相同的,我们可以简单的做点了解,比如前端针对的浏览器的MV,M指的是数据层(JSON、XML)与请求层(Ajax、Axios),V指的是包含HTML与CSS这种视图模块层;而后端的M指的是数据模块中的Session服务器、关系服务器等,其V用来指代各种计算机语言生成的模板。可以看到,在后端的MV与前端的MV存在差异,没有直接的联系。因为我本身为前端开发学习者,因此接下来讲解的方向均针对的是前端方向。
MVC
-
视图(View):用户界面。
-
控制器(Controller):业务逻辑
-
模型(Model):数据保存
这三者通过彼此单向环状联系,V层传送指令到C层,而C层完成业务后要求M层更改状态,M层再反馈数据给V层,因此用户会得到动态数据反馈。
用户可以通过方式1,直接更改View,而再传递给Controller;或选择2方式直接更改Controller
MVP
-
P(Presenter):业务逻辑
与mvc不同,在mvp中这三者实现了双向绑定,在V层与M层为彼此不联系关系,都通过p层进行数据传输
MVVM
MVVM,VM指ViuewModel,即为model-view-binder(模型-视图-视图模型),作为一种软件体系结构模式,它通过双向数据绑定,将View于Model的同步更新实现自动化,即Model变化带动ViewModel自动更新,ViewModel变化View也会更新,但V层与M层之间不会产生直接联系。而Vue就是通过数据劫持与发布-订阅模式实现这一功能(关于数据劫持与发布订阅模式届时我们通过与Vue的生命周期,利用Vue源码与流程图的方式一起讲解,这里指简单提及),引入vue就是可以更加方便的来处理的就是VM这数据绑定。
如下面代码所示,template处理的是V层,而其他对象针对的是model模块,我们的vue在这里将很多细节进行了隐藏,如同黑盒子般将v层与m层进行数据处理。
<body>
<div id="app"></div>
<script src="../js/vue.js"></script>
<script>
Vue.createApp({
template: `
<div>
<h2>{{message}}</h2>
<h2>{{counter}}</h2>
<button @click='increment'>+1</button>
<button @click='decrement'>-1</button>
</div>
`,
data: function() {
return {
message: "Hello World",
counter: 100
}
},
// 定义各种各样的方法
methods: {
increment() {
console.log("点击了+1");
this.counter++;
},
decrement() {
console.log("点击了-1");
this.counter--;
}
}
}).mount('#app');
</script>
</body>
JS还原MVVM双向绑定
这个时候或许还有人会好奇,MVVM的原理在代码逻辑上是怎么实现的,下面用原生JS代码进行简单的还原mvvm模式。
<body>
<script>
/* 设定初始变量 */
let msg = " Hello World!";
window.onload = function() {
/* 获取元素 */
let h2Dom = document.getElementById("h2Dom");
let inputDom = document.getElementById("inputDom");
/* 实现双向绑定 */
h2Dom.innerHTML = msg;
inputDom.value = msg;
inputDom.addEventListener("input", function() {
msg = this.value;
h2Dom.innerHTML = msg;
})
}
</script>
<!-- v层 -->
<div>
<h2 id="h2Dom"></h2>
<input id="inputDom" />
</div>
</body>
好了,对于三大模式的讲解就到这里了 ,欢迎订阅我的频道,如果对文章有其他深刻见解欢迎讨论。