MVVM 和 VUE 詳解

說一下使用Jquery和使用框架的區(qū)別

  • 數(shù)據(jù)和視圖的分離,解耦(開放封閉原則)
  • 以數(shù)據(jù)驅(qū)動(dòng)視圖,只關(guān)心數(shù)據(jù)變化,DOM操作被封裝

說一下對(duì)MVVM的理解

  • Model(模型、數(shù)據(jù)) View(DOM、視圖、模板) ViewModel ViewModel是鏈接Model和View的一個(gè)橋
  • view可以通過事件綁定的方式影響model
  • model可以通過數(shù)據(jù)綁定影響view

VUE、MVVM框架的三要素

  • 響應(yīng)式:vue如何監(jiān)聽到data的每個(gè)屬性變化?
  • 模板引擎:vue的模板如何被解析,指令如何處理?
  • 渲染:vue的模板如何被渲染成html?以及渲染過程

vue中如何實(shí)現(xiàn)響應(yīng)式

  • 什么是響應(yīng)式
    • 修改data屬性后,vue立刻監(jiān)聽到
    • data屬性被代理到vm上
  • Object.defineProperty(obj, prop, desc) 實(shí)現(xiàn)響應(yīng)式的核心函數(shù)

Object.defineProperty(obj, prop, desc)的作用就是直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)已經(jīng)存在的屬性
模板中沒有的數(shù)據(jù),不會(huì)走get監(jiān)聽,所以也不會(huì)走set監(jiān)聽,Object.defineProperty的原則是走get才會(huì)走set,防止無用的數(shù)據(jù)重復(fù)渲染。

  • 問題解答
    • 關(guān)鍵是理解Object.defineProperty
    • 將data的屬性代理到vm上
var vm = {}
var data = {
    name: 'zhangsan',
    age: 20
}

var key, value
for (key in data) {
    (function (key) {
        Object.defineProperty(vm, key, {
            get: function () {
                console.log('get', data[key]) // 監(jiān)聽
                return data[key]
            },
            set: function (newVal) {
                console.log('set', newVal) // 監(jiān)聽
                data[key] = newVal
            }
        })
    })(key)
}

vue中如何解析模板

  • 模板是什么?
    • 本質(zhì):字符串
    • 有邏輯,如v-if v-for等
    • 與html很像,但有很大區(qū)別
    • 最終還要轉(zhuǎn)化成html來顯示
    • 模板最終要裝換成js代碼(render函數(shù))
//模板
    <div id="app">
        <p>{{price}}</p>
    </div>
//render函數(shù)
        function render() {
            with(this) {  // this 就是 vm
                return _c(
                    'div',
                    {
                        attrs: {'id': 'app'}
                    },
                    [
                        _c('p', [_v(_s(price))])
                    ]
                )
            }
        }
//在vue源碼中搜索code.render,然后alert(code.render)可以看render函數(shù)

問題解答

  • h函數(shù)生成vdom
  • patch函數(shù)渲染成dom

vue的整個(gè)實(shí)現(xiàn)流程

  1. 解析模板成render函數(shù)
  2. 響應(yīng)式開始監(jiān)聽
  3. 首次渲染,顯示頁面,且綁定依賴
  4. data屬性變化,觸發(fā)rerender
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • vue理解淺談 一 理解vue的核心理念 使用vue會(huì)讓人感到身心愉悅,它同時(shí)具備angular和react的優(yōu)點(diǎn)...
    ndxs2008閱讀 24,388評(píng)論 2 18
  • VUE介紹 Vue的特點(diǎn)構(gòu)建用戶界面,只關(guān)注View層簡(jiǎn)單易學(xué),簡(jiǎn)潔、輕量、快速漸進(jìn)式框架 框架VS庫庫,是一封裝...
    多多醬_DuoDuo_閱讀 2,853評(píng)論 1 17
  • vue概述 在官方文檔中,有一句話對(duì)Vue的定位說的很明確:Vue.js 的核心是一個(gè)允許采用簡(jiǎn)潔的模板語法來聲明...
    li4065閱讀 7,593評(píng)論 0 25
  • 主要還是自己看的,所有內(nèi)容來自官方文檔。 介紹 Vue.js 是什么 Vue (讀音 /vju?/,類似于 vie...
    Leonzai閱讀 3,536評(píng)論 0 25
  • 前幾天想學(xué)學(xué)Vue中怎么編寫可復(fù)用的組件,提到要對(duì)Vue的render函數(shù)有所了解??勺屑?xì)一想,對(duì)于Vue的ren...
    kangaroo_v閱讀 116,506評(píng)論 13 171

友情鏈接更多精彩內(nèi)容