日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

手寫Vue2.0 數據劫持的示例

瀏覽:20日期:2022-10-03 17:02:17
一:搭建webpack

簡單的搭建一下webpack的配置。新建一個文件夾,然后init一下。之后新建一個webpack.config.js文件,這是webpack的配置文件。安裝一下簡單的依賴。

npm install webpack webpack-cli webpack-dev-server -D

在同級目錄下新建一個public/index.html和src/index.js,作為出口文件和入口文件。

j簡單配置一下webpack, 在webpack.config.js文件中:

const path = require(’path’);const HtmlWebpackPlugin = require(’html-webpack-plugin’);module.exports = { entry: ’./src/index.js’, output: { filename: ’bundle.js’, path: path.resolve(__dirname, ’dist’) }, resolve: { modules: [ path.resolve(__dirname, ’’), path.resolve(__dirname, ’node_modules’) ] }, plugins: [ new HtmlWebpackPlugin({ template: path.resolve(__dirname, ’public/index.html’) }) ]}

ok,基本配置好webpack就可以開始正題了。

二:數據劫持

在v2中,通過new Vue(el, options)的方式,完成vue的實例化。我們需要新建一下vue文件,把數據劫持的方法統一到vue中。

新建一個vue/index.js,作為數據劫持的入口文件。

import {initState} from ’./init.js’;function Vue (options) { this._init(options); // 數據初始化}Vue.prototype._init = function (options) { var vm = options; // 保存一下實例 vm.$options = options; // 實例掛載 initState(vm); // 實例初始化}

新建一個init.js文件初始化實例:

初始化的時候注意幾個問題:

1. 需要分別對computed,watch, data進行處理。

2. 不要在用戶定義的data上直接修改。

3. 官方指定data為函數,是為了保證組件內部有自己的作用域不會有污染,直接訪問data函數是不行的,需要自動執行。data也可以是對象(需要考慮到這個情況)

4. 這種方式獲取data是通過vm._data.xxx 但是在vue中不需要data來獲取,所以這里需要攔截重寫。

5. 內部的引用類型需要遞歸

function initState (vm) { var options = vm.$options; // 獲取options if (options.data) { initData(vm); // 因為computed,watch都需要在這里初始化,所以針對data初始化};function initData (vm) { var data = vm.$options.data; // 對data重新賦值,不要改變用戶定義的data data = vm._data = typeof data === ’function’ ? data.call(vm) : data || {}; for (var key in data) { proxyData(vm, ’_data’, key); // 對data的取值重新賦值 }; observe(vm._data); // 對data內部進行觀察}

新建一個proxy.js作為代理層:

function proxyData(vm, target, key) { Object.defineProperty(vm, key, { get () { // 這里做了攔截: vm.xxx => vm._data.xxx return vm[target][key]; }, set(newValue) { // vm.xxx = yyy ===> vm._data.title = yyy vm[target][key] = newValue; } }) }export default proxyData;

處理好了訪問問題,現在需要遞歸一下data內部元素。obseve(vm._data);

新建一個observe.js:

function observe (data) { if (typeof data !== ’object’ || data = null) return; return new Observer(data); // 如果是應用類型,直接添加一個觀察者}

新建一個觀察者:observer.js

function Observer(data) { if (Array.isArray(data)) { // 處理數組 data._proto_ = arrMethods; } else { // 處理對象 this.walks(data); }}Observer.prototype.walks = function (data) { let keys = Object.keys(data); // 拿到data下面所有的key,并且還是一個數組 for (var i = 0 ; i < keys.length ; i++) { var key = keys[i]; var value = data[key]; defineReactiveData(data, key, value); // 每個重新生成響應式數據 }}

新建一個reactive.js 處理對象等響應式

function defineReactiveData (data, key, value) { observe(value); // 對子元素接著遞歸。 Object.defineProperty(data, key, { get() { return value; }, set (newValue) { if (newValue === value) return; value = newValue; // 觸發更改 } } )};

ok,這里處理好了對象的數據劫持,剩余的需要處理數組了

在V2中采用重寫原型上的7種方法,做到數據劫持。

劫持數組:

新建一個Array.js文件:

import {ARR_METHODS} from ’./config.js’; // 7個數組方法的合集import observeArr from ’./observeArr.js’;var originArrMethods = Array.prototype, arrMethods = Object.create(originArrMethods); ARR_METHODS.map(function (m) { arrMethods[m] = function () { var args = Array.prototype.slice.call(arguments); // 類數組轉為數組 var rt = originArrMethods[m].apply(this, args); var newArr; switch (m) { case ’push’: case ’ushift’: newArr = args; case ’splice’:newArr = args.slice(2);break; default: break; }; newArr && observeArr(newArr); return rt; } }); export { arrMethods }

observeArr(newArr): 數組也可能有嵌套,所以需要對數據進行觀察。

import observe from './observe';function observeArr (arr) { for (var i = 0 ; i < arr.length ; i++) { observe(arr[i]); // 重新走到了observe上。 }}export default observeArr;三:總結

基本流程就是這樣的,不僅僅是object.defineProperty對數據進行get和set這么簡單。總結一下主要流程:

(1): 在初始化的時候:保存一下實例,掛載實例。通過initState方法來初始化數據,這里主要是data數據,也有computed和watch需要處理。

(2): 調用initData(); 重新賦值data,然后執行data,修改用戶獲取data屬性的寫法統一為this.xxx同時observe(data)

(3):在observe(data)的時候需要對data進行判斷,如果是引用類型需要加上一個觀察者observer,同時在觀察者終判斷data是為數組還是對象,對象直接重新觸發object.defineProperty,同時對內部重新observe。如果是數組直接重新7種數組方法,然后對數組內部接著observe。

以上就是手寫Vue2.0 數據劫持的示例的詳細內容,更多關于手寫vue 數據劫持的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲激情二区| 免费在线观看视频一区| 亚洲三级国产| 中文一区一区三区免费在线观| 亚洲神马久久| 中文一区在线| 丝袜亚洲另类欧美| 亚洲精品日韩久久| 日本欧美在线| 国产精品九九| 国产成人免费| 久久久久国产一区二区| 精品国产乱码久久久| 精品美女久久| 日韩在线精品| 亚洲一级网站| 亚洲无线观看| 国产三级一区| 久久久精品区| 伊人久久在线| 婷婷中文字幕一区| 蜜桃久久精品一区二区| 久久狠狠久久| 日韩电影在线视频| 欧美女激情福利| 香蕉久久一区| 精品久久久久中文字幕小说| 国产一区调教| 亚洲性图久久| 涩涩涩久久久成人精品| 欧美日韩亚洲三区| www在线观看黄色| 99亚洲精品| 欧美色综合网| 日韩高清欧美| 亚洲丝袜美腿一区| 久久女人天堂| 亚洲激情社区| 国产精品欧美三级在线观看| 天堂√中文最新版在线| 国产精品日韩久久久| 国产伦精品一区二区三区千人斩| 国产不卡精品在线| 亚洲婷婷在线| 日韩不卡一区二区三区 | 91精品亚洲| 亚洲日本在线观看视频| 精品视频网站| 视频一区欧美日韩| 精品国产乱码| 免费观看久久久4p| 国产一区二区三区精品在线观看| 妖精视频成人观看www| 国产极品一区| 亚洲免费在线| 成人午夜网址| 亚洲欧美不卡| 国产成人精品三级高清久久91| 国产99精品一区| 欧美片第1页综合| 亚洲天堂黄色| 国产精品igao视频网网址不卡日韩| 亚洲婷婷免费| 精品视频在线观看网站| 久久国产99| 欧美羞羞视频| 国产欧美日韩亚洲一区二区三区| 激情欧美国产欧美| 欧美极品中文字幕| 国产精品外国| 国产麻豆久久| 欧美精品中文| 好看不卡的中文字幕| 麻豆精品久久| 亚洲视频电影在线| 激情视频一区二区三区| 精品丝袜久久| 国产欧美激情| 综合一区av| 亚洲精品888| 欧美香蕉视频| 成人在线超碰| 欧美日韩亚洲一区| 免费日韩av| av一区二区高清| 久久久久久一区二区| 日韩高清不卡在线| 黄色亚洲精品| 色吊丝一区二区| 国产一区二区三区四区大秀| 日本欧美在线| 亚洲乱码久久| 欧美午夜不卡影院在线观看完整版免费| 日韩不卡一区| 久久久国产精品入口麻豆| 日本aⅴ亚洲精品中文乱码 | 国产欧美三级| 四虎精品一区二区免费| 99视频精品| 久久精品在线| 日韩国产在线| 日韩中文字幕高清在线观看| 国产一区丝袜| 精品国产乱码久久久久久樱花| 亚洲欧美日韩国产一区| 亚洲人成网77777色在线播放| 女生影院久久| 日韩国产一二三区| 亚洲中午字幕| 久久久影院免费| 精品亚洲成人| 国产精品色婷婷在线观看| 日本亚洲不卡| 中文字幕一区二区三区日韩精品 | 亚洲一二三区视频| 丝瓜av网站精品一区二区| 午夜影院欧美| 亚洲网站视频| 欧美精品一区二区久久| 久久久噜噜噜| 群体交乱之放荡娇妻一区二区| www.九色在线| 色婷婷亚洲mv天堂mv在影片| 国产精品2023| 欧美日韩一区自拍| 日韩高清在线不卡| 日本成人在线视频网站| 亚洲我射av| 日本不卡视频在线观看| 日韩一区二区三区精品| 亚洲精品大片| 日韩在线视频一区二区三区| 日韩1区2区3区| 亚洲专区视频| 日本强好片久久久久久aaa| 久久精品99国产精品| 国产精品综合| 久久亚洲黄色| 国产h片在线观看| 欧美日韩视频免费观看| 日韩在线免费| 国产精品99免费看| 日韩天堂av| 亚洲视频电影在线| 日本中文字幕一区二区| 911精品国产| 久久99精品久久久久久园产越南| 欧美激情在线精品一区二区三区| 另类综合日韩欧美亚洲| 欧美日韩在线观看首页| 精品一区毛片| 六月婷婷一区| 亚洲精品麻豆| 国产精品视频一区二区三区 | 麻豆视频在线观看免费网站黄| 精品成人免费一区二区在线播放| 蜜桃一区二区三区| 老牛影视一区二区三区| 日韩欧美美女在线观看| 欧美1区2区3| 日韩福利一区| 国产精品社区| 欧美视频精品全部免费观看| 久久99精品久久久野外观看| 国产自产自拍视频在线观看| 黄色成人精品网站| 日韩精品视频中文字幕| 精品一区二区三区中文字幕视频 | 日韩中文字幕亚洲一区二区va在线| 中文字幕免费一区二区| 欧美激情五月| 久久要要av| 一区二区三区国产在线| 久久国产精品免费精品3p| 红杏一区二区三区| 美女久久久久| 青青草国产成人99久久| 中文av在线全新| 美女国产精品| 精品午夜av| 亚洲一区免费| 国产精品网站在线看| 中文在线а√在线8| 天堂av在线一区| 国产精品久久久久77777丨| 欧美日韩一区二区三区视频播放| 亚洲日本国产| 久久婷婷av| 日韩中出av| 日韩免费久久| 日韩不卡一二三区| 四虎4545www国产精品| 日韩欧美美女在线观看| 91看片一区| 日本成人中文字幕在线视频| 蜜桃成人精品| 国产调教精品| 黑丝一区二区| 精品一级视频| 亚洲一区二区三区中文字幕在线观看|