中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

vue實現數據監聽的函數Object.defineProperty-創新互聯

這篇文章主要介紹了vue實現數據監聽的函數Object.defineProperty,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創新互聯專注于肥鄉企業網站建設,成都響應式網站建設,成都做商城網站。肥鄉網站建設公司,為肥鄉等地區提供建站服務。全流程專業公司,專業設計,全程項目跟蹤,成都創新互聯專業和態度為您提供的服務

Vue的優點

Vue具體輕量級框架、簡單易學、雙向數據綁定、組件化、數據和結構的分離、虛擬DOM、運行速度快等優勢,Vue中頁面使用的是局部刷新,不用每次跳轉頁面都要請求所有數據和dom,可以大大提升訪問速度和用戶體驗。

在 ES5中新增了不少新的API, 例如  新增了 Object.xxx相關的方法,其中有一個定義屬性相關的 Object.defineProperty 這個方法(還有Object.defineProperties)這個方法是 vue框架實現數據監聽的核心方法,它的定義如下:

Object.defineProperty([Object] obj, [String] propname, [Object] desp )

  1. @param  obj  要配置屬性的某個對象

  2. @param propname 要配置的屬性名,是一個字符串

  3. @param desp 對屬性的描述,是一個對象,

desp 中可以配置的項目 

<1> writable:  true/false 是否可寫

<2> configurable : true/false 是否可以配置,例如刪除該屬性

<3> enumerable: true/false 指的是是否可以使用 for in循環遍歷屬性

<4> value:  值  ,屬性的值

我們在寫vue項目的時候會在 data屬性中添加我們自己的屬性,這個屬性在vue中是響應式的,也就是它可以監聽到數據的變化,做出相應的改變(例如DOM操作)

我們自己利用 defineProperty給屬性生成setter和getter(也就是其他編程語言里的存取器),就可以達到監聽數據變化的目的

下面我們來自己實現一個數據監聽的小 demo

有如下的數據

  let vue = {
   data: {
    title: 'life style',
    content: 'bike walk sleep...'
   }
  };

已經提前聲明的 data屬性及其內部的屬性,我們的目標是監聽 data中,title和content的變化

如何做到呢? 屬性的個數是不確定的,所以我們可以使用 for in循環遍歷data對象的所有的屬性

  //如何監聽用戶自定義的 data中屬性的改變?
  let data = vue.data;
  for (let prop in data) {
   data['__' + prop] = data[prop]; //存儲私有屬性
   Object.defineProperty(data, prop, {
    enumerable : true,
    set: function (newVal) {
     console.log('你正在修改'+prop + ' !...操作DOM...');
     // 數據校驗
     this['__' + prop] = newVal;
    },
    get: function () {
     console.log('getter 獲取值 ...');
     return this['__' + prop];
    }
   });
  }

遍歷data屬性的時候調用 defineProperty來給data對象的屬性添加set和get方法,

我們給data添加一個新的屬性   __xxx來保存我們之前的值,以便在 get方法中獲取原來的值

set方法 用于監聽這個屬性被重新賦值,

get方法用于獲取你想要的格式的值

此處需要注意的是 不要在 set和get中 使用this賦值或者取值,這樣會導致循環調用,出現問題!!!

另外 我們不要使用 var,而要使用 let ,因為var不是塊作用域, 會導致你最后訪問到的prop總是最后一個

定義好之后,我們可以修改 data中title和content屬性了,

當我們給 title賦值的時候回自動調用 set, 獲取值得時候自動調用get

測試代碼

  // 賦值操作會調用這個屬性的set方法, 類似于 set('aaa')
  data.title = 'aaa';
  // 獲取值操作會調用這個屬性的get方法
  console.log(data.title);
  data.content = 123;
  // 此種動態屬性方式也會觸發 set / get
  data['title'] = 123;
  console.log(data['title']);

結果(建議在最新版的chrome中操作):

vue實現數據監聽的函數Object.defineProperty

對剛剛的遍歷方法還存在一些問題和說明:

1.data屬性的某個屬性可能還是對象,也就是存在多層級對象監聽的問題

此時可以使用遞歸函數遍歷data的屬性,進行相同操作

2. 通過  data.title = 1是實際上是調用了 set方法, 這個類似于 OC中的點語法

3. 要同時定義多個屬性,可以使用

Object.defineProperties([Object] obj, [Object] props);

感謝你能夠認真閱讀完這篇文章,希望小編分享的“vue實現數據監聽的函數Object.defineProperty”這篇文章對大家有幫助,同時也希望大家多多支持創新互聯建站,關注創新互聯網站建設公司行業資訊頻道,更多相關知識等著你來學習!

另外有需要云服務器可以了解下創新互聯建站www.2m8n56k.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

名稱欄目:vue實現數據監聽的函數Object.defineProperty-創新互聯
文章URL:http://www.2m8n56k.cn/article44/dhiehe.html

成都網站建設公司_創新互聯,為您提供虛擬主機、Google網站設計公司定制開發、用戶體驗、靜態網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站建設網站維護公司
主站蜘蛛池模板: 免费精品久久 | 久久国产精品永久免费网站 | 成人18视频在线 | 一级特黄aa大片欧美 | 久久久久综合国产 | 欧美一级α片毛片免费观看 | 99精品久久99久久久久久 | 精品91精品91精品国产片 | 精品亚洲成a人片在线观看 精品亚洲成a人在线播放 | 69av美女| 久久久国产免费影院 | 性欧美成人依依影院 | 成年大片免费视频播放手机不卡 | 欧美三级网站在线观看 | 日韩精品综合 | 免费视频一区二区三区四区 | 男人久久天堂 | 久久久久久国产精品视频 | 免费99视频 | 国产精品视频永久免费播放 | 久久成人午夜 | 亚洲一二区 | www成人免费视频 | 欧美精品人爱a欧美精品 | 996热这里有精品青青草原 | 亚洲天堂久久精品 | 欧美二区视频 | 亚洲欧美日韩久久一区 | 中文字幕在线不卡 | 亚洲第一网站 | 欧美性色xo影院69 | 国产三级香港在线观看 | 久草视频免费看 | 久在草| 一级毛片真人不卡免费播 | 高清韩国a级特黄毛片 | 久久精品免费视频观看 | 偷拍第1页 | 手机在线看福利 | 欧美精品videosbestsex另类 | 久久免费视频网 |