电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

手寫Vue2.0 數(shù)據(jù)劫持的示例

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

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

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

在同級目錄下新建一個(gè)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就可以開始正題了。

二:數(shù)據(jù)劫持

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

新建一個(gè)vue/index.js,作為數(shù)據(jù)劫持的入口文件。

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

新建一個(gè)init.js文件初始化實(shí)例:

初始化的時(shí)候注意幾個(gè)問題:

1. 需要分別對computed,watch, data進(jìn)行處理。

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

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

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

5. 內(nèi)部的引用類型需要遞歸

function initState (vm) { var options = vm.$options; // 獲取options if (options.data) { initData(vm); // 因?yàn)閏omputed,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內(nèi)部進(jìn)行觀察}

新建一個(gè)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;

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

新建一個(gè)observe.js:

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

新建一個(gè)觀察者:observer.js

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

新建一個(gè)reactive.js 處理對象等響應(yīng)式

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

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

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

劫持?jǐn)?shù)組:

新建一個(gè)Array.js文件:

import {ARR_METHODS} from ’./config.js’; // 7個(gè)數(shù)組方法的合集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); // 類數(shù)組轉(zhuǎn)為數(shù)組 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): 數(shù)組也可能有嵌套,所以需要對數(shù)據(jù)進(jìn)行觀察。

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

基本流程就是這樣的,不僅僅是object.defineProperty對數(shù)據(jù)進(jìn)行g(shù)et和set這么簡單。總結(jié)一下主要流程:

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

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

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

以上就是手寫Vue2.0 數(shù)據(jù)劫持的示例的詳細(xì)內(nèi)容,更多關(guān)于手寫vue 數(shù)據(jù)劫持的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 广西教师资格网-广西教师资格证考试网| 减速机三参数组合探头|TSM803|壁挂式氧化锆分析仪探头-安徽鹏宸电气有限公司 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 净化工程_无尘车间_无尘车间装修-广州科凌净化工程有限公司 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 酒店厨房设计_中央厨房设计_北京商用厨房设计公司-奇能商厨 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 高柔性拖链电缆_卷筒电缆_耐磨耐折聚氨酯电缆-玖泰特种电缆 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 水轮机密封网 | 水轮机密封产品研发生产厂家| 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 铝镁锰板_铝镁锰合金板_铝镁锰板厂家_铝镁锰金属屋面板_安徽建科 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 九爱图纸|机械CAD图纸下载交流中心 | 电主轴-高速精密电主轴-高速电机厂家-瑞德沃斯品牌有限公司 | 奥因-光触媒除甲醛公司-除甲醛加盟公司十大品牌 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 伸缩器_伸缩接头_传力接头-巩义市润达管道设备制造有限公司 | 建大仁科-温湿度变送器|温湿度传感器|温湿度记录仪_厂家_价格-山东仁科 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 中国品牌门窗网_中国十大门窗品牌_著名门窗品牌 | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | 酒万铺-酒水招商-酒水代理| 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 |