MVC與MVVM框架


什么是MVC?

MVC思想:Controller負責將Model的數據用View顯示出來。

Model:處理數據邏輯的部分,負責在數據庫中存儲數據。

View:處理數據的顯示部分

Controller:是應用程序的交互部分,通常控制器負責從視圖中讀取數據,控制用戶輸入,並向模型發送數據。

Controller是MVC中數據和視圖的協調者,也就是Controller里面把Model的數據賦值給view來實現,或者是View接收用戶輸入的數據然后由Controller把這些數據傳給Model來保存到本地或者上傳到服務器。

通信流程:

(1)View接收用戶傳入的數據,傳送指令到Controller

(2)Controller完成業務邏輯后,要求Model改變狀態

(3)Model將新的數據發送到View,用戶得到反饋

所有通信都是單向的。

在MVC中,view是可以直接訪問model的,從而view里會包含model的信息, 不可避免的還要包含一些業務邏輯。MVC關注的是Model的不變,所以在MVC模型中,Model不依賴於View,但是View是依賴於Model的。不僅如此,因為有一些業務邏輯在View里實現了,導致要更新View也是比較困難的,至少業務邏輯是無法重用的。

 

什么是MVVM?MVVM是Model-View-ViewModel的縮寫。

MVVM最早由微軟提出來,它借鑒了桌面應用程序的MVC思想,在前端頁面中,把Model用純JavaScript對象表示,View負責顯示,兩者做到了最大限度的分離。

MVVM是將其中view的狀態和行為抽象化,讓我們將視圖UI和業務邏輯分開,當然這些事viewModel已經幫我們做了,它可以取出model的數據同時幫忙處理view中由於需要展示內容而涉及的業務邏輯。

它采用雙向綁定:View的變動自動反映在ViewModel,反之亦然。

把Model和View關聯起來的就是ViewModel。ViewModel負責把Model的數據同步到View顯示出來,還負責把View的修改同步回Model。

一個MVVM框架和jQuery操作DOM相比有什么區別?

我們先看用jQuery實現的修改兩個DOM節點的例子:

<!-- HTML --> <p>Hello, <span id="name">Bart</span>!</p> <p>You are <span id="age">12</span>.</p> 

Hello, Bart!

You are 12.

用jQuery修改name和age節點的內容:

var name = 'Homer';
var age = 51;

$('#name').text(name);
$('#age').text(age);

如果我們使用MVVM框架來實現同樣的功能,我們首先並不關心DOM的結構,而是關心數據如何存儲。最簡單的數據存儲方式是使用JavaScript對象:

var person = { name: 'Bart', age: 12 };

我們把變量person看作Model,把HTML某些DOM節點看作View,並假定它們之間被關聯起來了。

要把顯示的name從Bart改為Homer,把顯示的age從12改為51,我們並不操作DOM,而是直接修改JavaScript對象:

person.name = 'Homer';
person.age = 51;

執行上面的代碼,我們驚訝地發現,改變JavaScript對象的狀態,會導致DOM結構作出對應的變化!這讓我們的關注點從如何操作DOM變成了如何更新JavaScript對象的狀態,而操作JavaScript對象比DOM簡單多了!

 

這就是MVVM的設計思想:關注Model的變化,讓MVVM框架去自動更新DOM的狀態,從而把開發者從操作DOM的繁瑣步驟中解脫出來!

 

Vue和jQuery的對比:

  jQuery是使用選擇器($)選取元素,對其進行賦值、取值、事件綁定等操作,其實和原生的JS的區別只是在於更方便地操作DOM對象,而數據和界面是在一起的,比如獲取label標簽的內容:$('label').val()。

  Vue則是通過Vue對象將數據和view層完全分離開來。對數據進行操作不再需要引用相應的DOM對象,可以說數據和View是分離的,他們通過vue對象實現相互的綁定。

舉例說明:

像列表中添加一個元素,vue只需向message里push一條數據即可完成一個添加li標簽的操作,而jquery則需要先獲取dom節點,並對dom進行添加一個標簽的操作。

vue:

<body>
    <div id="app">
        <ul>
            <!--根據數組數據自動渲染頁面-->
            <li v-for="item in message">{{item}}</li>
        </ul>
        <button @click="add">添加數據</button>
    </div>
</body>

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            message: ["第1條數據","第2條數據"],
            i:2
        },
        methods:{
            //向數組添加一條數據即可
            add:function(){
                this.i++
                this.message.push(""+this.i+"條數據")
            }
        }
    })
</script>

jQuery:

<body>
    <div id="app">
        <ul id="list">
            <li>第1條數據</li>
            <li>第2條數據</li>
        </ul>
        <button id="add">添加數據</button>
    </div>

</body>

<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script>
    $(document).ready(function() {  
    var i=2;
    $('#add').click(function() { 
       i++; 
       //通過dom操作在最后一個li元素后手動添加一個標簽
      $("#list").children("li").last().append("<li>第"+i+"條數據</li>")
    });  
  }); 
</script>

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM