国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript從初級(jí)往高級(jí)走系列————MVVM-Vue

codercao / 2889人閱讀

摘要:原文博客地址如何理解如何實(shí)現(xiàn)是否解讀過(guò)的源碼與框架的區(qū)別實(shí)現(xiàn)實(shí)現(xiàn)獨(dú)立初始化實(shí)例兩者的區(qū)別數(shù)據(jù)和視圖的分離,解耦開(kāi)放封閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉在中在代碼中操作視圖和數(shù)據(jù),混在一塊了以數(shù)據(jù)驅(qū)動(dòng)視圖,只關(guān)心數(shù)據(jù)變化,

原文博客地址:https://finget.github.io/2018/05/31/mvvm-vue/
MVVM

如何理解 MVVM

如何實(shí)現(xiàn) MVVM

是否解讀過(guò) Vue 的源碼

Jquery 與 框架的區(qū)別 jquery 實(shí)現(xiàn) todo-list
    vue 實(shí)現(xiàn) todo-list
    • {{item}}
    兩者的區(qū)別

    數(shù)據(jù)和視圖的分離,解耦(開(kāi)放封閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉)

    在jQuery中在jQuery代碼中操作視圖和數(shù)據(jù),混在一塊了

    以數(shù)據(jù)驅(qū)動(dòng)視圖,只關(guān)心數(shù)據(jù)變化,DOM操作被封裝

    只改數(shù)據(jù),視圖自動(dòng)更新

    MVVM的理解

    MVC (Model View Controller)

    MVVM (Model View ViewModel)

    View 通過(guò) 事件綁定 (DOM Listeners) 操作Model; Model通過(guò) 數(shù)據(jù)綁定 (Data Bindings)操作View。
    Vue 三要素

    響應(yīng)式: Vue 如何監(jiān)聽(tīng)到 data 的每個(gè)屬性變化?

    模板引擎: Vue 的模板如何被解析,指令如何處理?

    渲染:Vue 的模板如何被渲染成Html?

    Vue中如何實(shí)現(xiàn)響應(yīng)式 什么是響應(yīng)式

    修改 data 屬性之后, Vue 立刻監(jiān)聽(tīng)到

    data 屬性被代理到 vm上

    var vm = new Vue({
      el: "#app",
      data: {
        name: "zhangsan",
        age: 20
      }
    })
    // vm.name = "zhangsan"
    // vm.age = "20"
    Object.defineProperty,Vue核心函數(shù)
    var obj = {
      name: "zhangsan",
      age: 25
    }
    console.log(obj.name); // 獲取屬性的時(shí)候,如何監(jiān)聽(tīng)
    obj.age = 26; // 賦值屬性的時(shí)候,如何監(jiān)聽(tīng)

    上面是無(wú)法監(jiān)聽(tīng)對(duì)象的屬性的訪問(wèn)以及賦值操作的,直接就產(chǎn)生了操作的結(jié)果。

    var obj = {}
    var _name = "shangsan"
    Object.defineProperty(obj, "name", {
      get: function () {
        console.log("get", _name) // 監(jiān)聽(tīng)
        return _name
      },
      set: function (newVal) {
        console.log("set", newVal)  // 監(jiān)聽(tīng)
        _name = newVal
      }
    })
    console.log(obj.name); // 可以監(jiān)聽(tīng)到
    obj.name = "lisi"; // 可以監(jiān)聽(tīng)到
    Vue 中何如解析模板 模板是什么
    • {{item}}

    本質(zhì): 字符串

    有邏輯, 如 v-if v-for

    與 html 標(biāo)簽格式很像,但有很大區(qū)別(html是靜態(tài)的,模板是動(dòng)態(tài)的)

    最終還要轉(zhuǎn)換為 html 來(lái)顯示

    模板最終必須轉(zhuǎn)換成 JS 代碼

    有邏輯(v-if v-for 等),必須用JS才能實(shí)現(xiàn)(圖靈完備)

    因此,模板最重要轉(zhuǎn)成一個(gè)JS函數(shù)(render函數(shù))

    render函數(shù)
    with -- 實(shí)際開(kāi)發(fā)不推薦用
    var obj = {
      name: "zhangsan",
      age: 20,
      getAddress: function () {
        alert("beijing")
      }
    }
    // 不使用with
    function fn() {
      alert(obj.name)
      alert(obj.age)
      obj.getAddress()
    }
    fn()
    
    // 使用with
    function fn1() {
      with(obj) {
        alert(age)
        alert(name)
        getAddress()
      }
    }
    fn1()
    render

    {{price}}

    模板將變成下面這個(gè)樣子:

    function render() {
      with(this) {  // this 就是 vm
        return _c(
          "div",
          {
            attrs: {"id": "app"}
          },
          [
            _c("p", [_v(_s(price))])
          ]
        )
      }
    }

    看todo-list的render

    在vue源碼里alert render 函數(shù)

    以上面vue實(shí)現(xiàn)的todolist為例:

    with(this){  // this 就是 vm
        return _c( // _c創(chuàng)建一個(gè)標(biāo)簽
            "div",
            {
                attrs:{"id":"app"}
            },
            [
                _c(
                    "div",
                    [
                        _c(
                            "input",
                            {
                                directives:[
                                    {
                                        name:"model",
                                        rawName:"v-model",
                                        value:(title),
                                        expression:"title"
                                    }
                                ],
                                domProps:{
                                    "value":(title)
                                },
                                on:{
                                    "input":function($event){
                                        if($event.target.composing)return;
                                        title=$event.target.value
                                    }
                                }
                            }
                        ),
                        _v(" "),
                        _c(
                            "button",
                            {
                                on:{
                                    "click":add
                                }
                            },
                            [_v("submit")]
                        )
                    ]
                ),
                _v(" "),
                _c("div",
                   [
                    _c(
                        "ul",
                        _l((list),function(item){return _c("li",[_v(_s(item))])}) // _l 解析 v-for 循環(huán)
                    )
                ]
              )
            ]
        )
    }
    render 與 Vdom

    可以先看一下virtualDom

    vm._c 其實(shí)相當(dāng)于 snabbdom 中的 h 函數(shù)

    render 函數(shù)執(zhí)行之后,返回的是 vnode

    updateComponent 中實(shí)現(xiàn)了 vdom 的 patch

    頁(yè)面首次渲染 執(zhí)行updateComponent

    data 中每次修改屬性, 執(zhí)行 updateComponent

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

    第一步: 解析模板成render函數(shù)

    with 的用法

    模板中的所有信息都被render函數(shù)包含

    模板中用到的data中的屬性,都變成了js變量

    模板中的v-model v-if v-on 都變成了 js邏輯

    render 函數(shù)返回 vnode


    第二部: 響應(yīng)式開(kāi)始監(jiān)聽(tīng)

    Object.defineProperty

    將 data 的屬性代理到 vm 上

    第三步: 首次渲染,顯示頁(yè)面,且綁定依賴

    第四步: data 屬性變化,觸發(fā) rerender

    最后

    創(chuàng)建了一個(gè)前端學(xué)習(xí)交流群,感興趣的朋友,一起來(lái)嗨呀!

    文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/99542.html

    相關(guān)文章

    • JavaScript初級(jí)高級(jí)系列————prototype

      摘要:原文博客地址另一篇轉(zhuǎn)載的從初級(jí)往高級(jí)走系列原型定義原型是對(duì)象的一個(gè)屬性,它定義了構(gòu)造函數(shù)制造出的對(duì)象的公共祖先。 原文博客地址:https://finget.github.io/2018/09/13/proto/另一篇轉(zhuǎn)載的JavaScript從初級(jí)往高級(jí)走系列————prototype 原型 定義: 原型是function對(duì)象的一個(gè)屬性,它定義了構(gòu)造函數(shù)制造出的對(duì)象的公共祖先。通...

      SKYZACK 評(píng)論0 收藏0
    • JavaScript初級(jí)高級(jí)系列————異步

      摘要:之所以是單線程,取決于它的實(shí)際使用,例如不可能同添加一個(gè)和刪除這個(gè),所以它只能是單線程的。所以,這個(gè)新標(biāo)準(zhǔn)并沒(méi)有改變單線程的本質(zhì)。 原文博客地址:https://finget.github.io/2018/05/21/async/ 異步 什么是單線程,和異步有什么關(guān)系 什么是event-loop 是否用過(guò)jQuery的Deferred Promise的基本使用和原理 介紹一下asyn...

      andot 評(píng)論0 收藏0
    • JavaScript初級(jí)高級(jí)系列————Virtual Dom

      摘要:當(dāng)中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀,風(fēng)格,而不會(huì)影響布局的,比如。則就叫稱為重繪。 原文博客地址:https://finget.github.io/2018/05/22/virtualDom/ 什么是虛擬DOM 用JS模擬DOM結(jié)構(gòu) DOM變化的對(duì)比,放在JS層來(lái)做(圖靈完備語(yǔ)言) 提高重繪性能 重繪和回流 頁(yè)面渲染過(guò)程:showImg(https://seg...

      tinyq 評(píng)論0 收藏0
    • JavaScript初級(jí)高級(jí)系列————ES6

      摘要:采用二八定律,主要涉及常用且重要的部分。對(duì)象是當(dāng)前模塊的導(dǎo)出對(duì)象,用于導(dǎo)出模塊公有方法和屬性。箭頭函數(shù)函數(shù)箭頭函數(shù)把去掉,在與之間加上當(dāng)我們使用箭頭函數(shù)時(shí),函數(shù)體內(nèi)的對(duì)象,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。 ES6 原文博客地址:https://finget.github.io/2018/05/10/javascript-es6/ 現(xiàn)在基本上開(kāi)發(fā)中都在使用ES6,瀏覽器環(huán)境...

      孫淑建 評(píng)論0 收藏0
    • 程序員若不想吃青春飯,就得不斷進(jìn)階提升

      摘要:程序員到底是不是吃青春飯首先要明白什么是青春飯,青春飯的標(biāo)記是什么你這個(gè)行業(yè)或者是職業(yè)強(qiáng)調(diào)的是體力還是經(jīng)驗(yàn)和人脈如果你這個(gè)行業(yè)強(qiáng)調(diào)的是體力的話,那么這就是青春飯,比如快遞員工地搬磚人員等等。 ...

      ygyooo 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <