Vue基礎(chǔ):數(shù)據(jù)代理氧骤、模板解析、數(shù)據(jù)綁定吃引、四大對象

1. 準(zhǔn)備

1.[].slice.call(lis): 將偽數(shù)組轉(zhuǎn)換為真數(shù)組
2.node.nodeType: 得到節(jié)點類型
3.Object.defineProperty(obj, propertyName, {}): 給對象添加/修改屬性(指定描述符)
    configurable: true/false  是否可以重新define
    enumerable: true/false 是否可以枚舉(for..in / keys())
    value: 指定初始值
    writable: true/false value是否可以修改存取(訪問)描述符
    get: 函數(shù), 用來得到當(dāng)前屬性值
    set: 函數(shù), 用來監(jiān)視當(dāng)前屬性值的變化
4.Object.keys(obj): 得到對象自身可枚舉的屬性名的數(shù)組
5.DocumentFragment: 文檔碎片(高效批量更新多個節(jié)點)
6.obj.hasOwnProperty(prop): 判斷prop是否是obj自身的屬性

2. 數(shù)據(jù)代理(MVVM.js)

1.通過一個對象代理對另一個對象中屬性的操作(讀/寫)
2.通過vm對象來代理data對象中所有屬性的操作
3.好處: 更方便的操作data中的數(shù)據(jù)
4.基本實現(xiàn)流程
    1). 通過Object.defineProperty()給vm添加與data對象的屬性對應(yīng)的屬性描述符
    2). 所有添加的屬性都包含getter/setter
    3). 在getter/setter內(nèi)部去操作data中對應(yīng)的屬性數(shù)據(jù)

3. 模板解析(compile.js)

1.模板解析的關(guān)鍵對象: compile對象
2.模板解析的基本流程:
    1). 將el的所有子節(jié)點取出, 添加到一個新建的文檔fragment對象中
    2). 對fragment中的所有層次子節(jié)點遞歸進行編譯解析處理
        * 對表達式文本節(jié)點進行解析
        * 對元素節(jié)點的指令屬性進行解析
            * 事件指令解析
            * 一般指令解析
    3). 將解析后的fragment添加到el中顯示
3.解析表達式文本節(jié)點: textNode.textContent = value
    1). 根據(jù)正則對象得到匹配出的表達式字符串: 子匹配/RegExp.$1
    2). 從data中取出表達式對應(yīng)的屬性值
    3). 將屬性值設(shè)置為文本節(jié)點的textContent
4.事件指令解析: elementNode.addEventListener(事件名, 回調(diào)函數(shù).bind(vm))
    v-on:click="test"
    1). 從指令名中取出事件名
    2). 根據(jù)指令的值(表達式)從methods中得到對應(yīng)的事件處理函數(shù)對象
    3). 給當(dāng)前元素節(jié)點綁定指定事件名和回調(diào)函數(shù)的dom事件監(jiān)聽
    4). 指令解析完后, 移除此指令屬性
5.一般指令解析: elementNode.xxx = value
    1). 得到指令名和指令值(表達式)
    2). 從data中根據(jù)表達式得到對應(yīng)的值
    3). 根據(jù)指令名確定需要操作元素節(jié)點的什么屬性
        * v-text---textContent屬性
        * v-html---innerHTML屬性
        * v-class--className屬性
    4). 將得到的表達式的值設(shè)置到對應(yīng)的屬性上
    5). 移除元素的指令屬性

4. 數(shù)據(jù)劫持-->數(shù)據(jù)綁定

1.數(shù)據(jù)綁定(model==>View):
    1). 一旦更新了data中的某個屬性數(shù)據(jù), 所有界面上直接使用或間接使用了此屬性的節(jié)點都會更新(更新)
2.數(shù)據(jù)劫持
    1). 數(shù)據(jù)劫持是vue中用來實現(xiàn)數(shù)據(jù)綁定的一種技術(shù)
    2). 基本思想: 通過defineProperty()來監(jiān)視data中所有屬性(任意層次)數(shù)據(jù)的變化, 一旦變化就去更新界面
3.四個重要對象
    1). Observer
        * 用來對data所有屬性數(shù)據(jù)進行劫持的構(gòu)造函數(shù)
        * 給data中所有屬性重新定義屬性描述(get/set)
        * 為data中的每個屬性創(chuàng)建對應(yīng)的dep對象
    2). Dep(Depend)
        * data中的每個屬性(所有層次)都對應(yīng)一個dep對象
        * 創(chuàng)建的時機:
            * 在初始化define data中各個屬性時創(chuàng)建對應(yīng)的dep對象
            * 在data中的某個屬性值被設(shè)置為新的對象時
        * 對象的結(jié)構(gòu)
            {
              id, // 每個dep都有一個唯一的id
              subs //包含n個對應(yīng)watcher的數(shù)組(subscribes的簡寫)
            }
        * subs屬性說明
            * 當(dāng)一個watcher被創(chuàng)建時, 內(nèi)部會將當(dāng)前watcher對象添加到對應(yīng)的dep對象的subs中
            * 當(dāng)此data屬性的值發(fā)生改變時, 所有subs中的watcher都會收到更新的通知, 從而最終更新對應(yīng)的界面
    3). Compile
        * 用來解析模板頁面的對象的構(gòu)造函數(shù)(一個實例)
        * 利用compile對象解析模板頁面
        * 每解析一個表達式(非事件指令)都會創(chuàng)建一個對應(yīng)的watcher對象, 并建立watcher與dep的關(guān)系
        * complie與watcher關(guān)系: 一對多的關(guān)系
    4). Watcher
        * 模板中每個非事件指令或表達式都對應(yīng)一個watcher對象
        * 監(jiān)視當(dāng)前表達式數(shù)據(jù)的變化
        * 創(chuàng)建的時機: 在初始化編譯模板時
        * 對象的組成
            {
              vm,  //vm對象
              exp, //對應(yīng)指令的表達式
              cb, //當(dāng)表達式所對應(yīng)的數(shù)據(jù)發(fā)生改變的回調(diào)函數(shù)
              value, //表達式當(dāng)前的值
              depIds //表達式中各級屬性所對應(yīng)的dep對象的集合對象
                      //屬性名為dep的id, 屬性值為dep
            }
        
    5). 總結(jié): dep與watcher的關(guān)系: 多對多
        * 一個data中的屬性對應(yīng)對應(yīng)一個dep, 一個dep中可能包含多個watcher(模板中有幾個表達式使用到了屬性)
        * 模板中一個非事件表達式對應(yīng)一個watcher, 一個watcher中可能包含多個dep(表達式中包含了幾個data屬性)
        * 數(shù)據(jù)綁定使用到2個核心技術(shù)
            * defineProperty()
            * 消息訂閱與發(fā)布

4.雙向數(shù)據(jù)綁定
    1). 雙向數(shù)據(jù)綁定是建立在單向數(shù)據(jù)綁定(model==>View)的基礎(chǔ)之上的
    2). 雙向數(shù)據(jù)綁定的實現(xiàn)流程:
        * 在解析v-model指令時, 給當(dāng)前元素添加input監(jiān)聽
        * 當(dāng)input的value發(fā)生改變時, 將最新的值賦值給當(dāng)前表達式所對應(yīng)的data屬性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筹陵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子镊尺,更是在濱河造成了極大的恐慌朦佩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庐氮,死亡現(xiàn)場離奇詭異语稠,居然都是意外死亡,警方通過查閱死者的電腦和手機旭愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門颅筋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人输枯,你說我怎么就攤上這事议泵。” “怎么了桃熄?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵先口,是天一觀的道長。 經(jīng)常有香客問我瞳收,道長碉京,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任螟深,我火速辦了婚禮谐宙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘界弧。我一直安慰自己凡蜻,他們只是感情好搭综,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著划栓,像睡著了一般兑巾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忠荞,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天蒋歌,我揣著相機與錄音,去河邊找鬼委煤。 笑死堂油,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碧绞。 我是一名探鬼主播称诗,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼头遭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起癣诱,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤计维,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撕予,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲫惶,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年实抡,在試婚紗的時候發(fā)現(xiàn)自己被綠了欠母。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡吆寨,死狀恐怖赏淌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啄清,我是刑警寧澤六水,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站辣卒,受9級特大地震影響掷贾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荣茫,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一想帅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啡莉,春花似錦港准、人聲如沸旨剥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泞边。三九已至,卻和暖如春疗杉,著一層夾襖步出監(jiān)牢的瞬間阵谚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工烟具, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梢什,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓朝聋,卻偏偏與公主長得像嗡午,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冀痕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容