<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • Vue雙向數據綁定原理

          2021-4-14    前端達人

          1. vue雙向數據綁定是通過 數據劫持,并結合 發布-訂閱模式的方法來實現的,也就是說數據和視圖同步,數據發生變化,視圖跟著變化,視圖變化,數據也隨之發生改變

          2. 核心:關于vue實現雙向數據綁定,其核心是Object.defineProperty()方法

          3. 介紹一下Object.defineProperty()方法

          1.Object.defineProperty(obj,prop,descriptor)這個語法內有三個參數,分別是obj(要定義其上屬性的對象) prop (要定義或修改的屬性)descriptor (具體的改變方法)
          2.簡單的說 就是用這個方法來定義一個值。當調用時我們使用了它里面的get方法,當我們給這個屬性賦值的時候,又用到了它里面的set方法

          var obj = {}; Object.defineProperty(obj,'hello',{ get: function(){ console.log('調用了get方法') }, set: function(newValue){ console.log('調用了set方法,方法的值是' + newValue); } }); obj.hello; // => '調用了get方法' obj.hello = 'hi'; // => '調用了set方法,方法的值是hi' 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11

          4. 再介紹一下發布-訂閱模式

          在這里插入圖片描述

          原文來自于這里,我說一下我自己的理解,其實發布-訂閱模式和觀察者模式很像,但是不同的是,觀察者模式只有兩個角色,而且Obsever是知道Subject的,但是在發布-訂閱模式中,他們兩卻彼此不了解,他們是在一種類似于中間件的幫助下進行通信的,換句話說,還有第三個組件,稱為代理或消息代理或事件總線,Observer和Subject都知道該組件,該組件過濾所有傳入消息并相應的分發他們。

          5. 然后就是簡單模擬實現一下Vue的雙向數據綁定

          <input type="text"> <p></p> 
          
          • 1
          • 2

          我們要對上面兩個DOM元素實現雙向數據綁定,就是當輸入inputValue時下面的p可以及時更新inputValue內容

          <script> let input = document.querySelector('input') let p = document.querySelector('p') let obj = {} let value = '' Object.defineProperty(obj, 'inputvalue', { get() { return value }, set(newValue) { input.value = newValue
                      p.innerHTML = newValue } }) // 訂閱者 DOM元素 input.value = obj.inputvalue
              p.innerHTML = obj.inputvalue // 監聽輸入的事件 input.addEventListener('keyup', function (e) { // 修改inputvalue 達到修改input.value 以及input.innerHTML // 發布者 obj.inputvalue = e.target.value // 觸發了set }) </script> 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24

          所以在我們的代碼中,訂閱者就是頁面中的DOM元素,因為他會訂閱我們的inputvalue,而發布者就是監聽事件中的數據,一旦監聽到了數據有修改,就要發布給我們的訂閱者,也就是說輸入的數據一旦發生了變化,我們的頁面DOM元素的數據也會發生變化,所以這個中間件就是Object.defineProperty中的set方法

          6. 結果演示

          在這里插入圖片描述


          轉自:csdn 論壇 作者:Y shǔ shǔ


          藍藍設計m.sdgs6788.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://m.sdgs6788.com

          存檔

          青青热久久国产久精品 | 久久久亚洲精品蜜桃臀| 99久久精品免费| 久久九九久精品国产免费直播| 亚洲国产成人久久综合野外| 奇米影视7777久久精品| 久久精品国产亚洲7777| 麻豆亚洲AV永久无码精品久久 | 一本一道久久精品综合| 久久人人添人人爽添人人片牛牛| 91久久精一区二区三区大全| 久久综合狠狠综合久久97色| 色综合久久中文色婷婷| 欧美丰满熟妇BBB久久久| 亚洲欧洲精品成人久久奇米网 | 亚洲国产视频久久| 99久久国产热无码精品免费久久久久| 亚洲国产精品无码久久98| 久久影视国产亚洲| 久久国产成人午夜aⅴ影院| 国产成人精品白浆久久69 | 亚洲一区中文字幕久久| 人妻精品久久久久中文字幕一冢本 | 亚洲AV无码一区东京热久久| 久久精品国产一区二区三区| 久久最近最新中文字幕大全| 久久精品国产亚洲AV无码娇色 | 久久精品一本到99热免费| 欧美久久亚洲精品| 久久九色综合九色99伊人| 国产免费久久精品丫丫| 国产精品免费久久久久电影网| 91久久香蕉国产熟女线看| 国产精品免费久久久久电影网| 久久亚洲国产精品一区二区| 久久99国产精品久久99果冻传媒| 久久久久国产精品熟女影院 | 性做久久久久久久久浪潮| 2021国产精品久久精品| 中文国产成人精品久久不卡| 中文字幕无码精品亚洲资源网久久|