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

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

Vue2 中的數據劫持簡寫示例

瀏覽:131日期:2022-06-02 08:22:40
目錄
  • package.json 相關依賴
  • Webpack.config.js 配置文件
  • public/index.html 文件內容
  • 全部文件目錄結構
  • 實例一個模擬的 Vue 應用
    • vue/index.js 文件主要是負責初始化內容
    • initState方法
    • 核心文件vue/observer.js
    • vue/observer.js文件對數組進行處理

package.json 相關依賴

我們今天要編寫的項目通過需要使用 Webpack 進行編譯,package.json 相關依賴如下:

{  "scripts": {    "dev": "webpack-dev-server",    "build:": "webpack"  },  "devDependencies": {    "html-webpack-plugin": "^4.5.2",    "webpack": "^4.46.0",    "webpack-cli": "^3.3.12",    "webpack-dev-server": "^3.11.3"  }}

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")  },  devtool: "source-map",  resolve: {    // 表示解析模塊引入的時候先從當前文件夾尋找模塊,再去 node_modules 找模塊    modules: [      path.resolve(__dirname, ""),       path.resolve(__dirname, "node_modules")    ]  },  plugins: [    new HtmlWebpackPlugin({      template: path.resolve(__dirname, "public/index.html")    })  ]};

public/index.html 文件內容

<!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title></title>  </head>  <body>    <div id="app"></div>  </body></html>

全部文件目錄結構

好了,接下來我們就開始發車!

實例一個模擬的 Vue 應用

首先,我們需要編寫我們的入口文件 index.js,該文件很普通主要就是實例一個模擬的 Vue 應用:

// index.js// 我們在 webpack.config.js 中進行了配置,所以這里優先在當前目錄下尋找 vue 文件,也就是我們的 vue/index.js 文件import Vue from "vue"; let vm = new Vue({  el: "#app",  data() {    return {      title: "學生列表",      classNum: 1,      teacher: ["張三", "李四"],      info: {a: {  b: 1}      },      students: [{  id: 1,  name: "小紅"},{  id: 2,  name: "小明"}      ]    };  }});console.log(vm);

vue/index.js 文件主要是負責初始化內容

// src/sindex.jsimport { initState } from "./init";function Vue(options) {  this._init(options);}Vue.prototype._init = function (options) {  // this 指向當前實例對象  var vm = this;  // 我們把 new Vue() 時候傳遞的數據統稱為 options  // 并且掛載到 Vue 的實例對象上  vm.$options = options;  // 調用 initState 初始化 data 數據  initState(vm);};export default Vue;

initState方法

vue/init.js 文件暴露出一個initState方法,該方法主要是處理初始化的數據:

// vue/init.jsimport proxyData from "./proxy";import observer from "./observe"function initState(vm) {  var options = vm.$options;  // 如果 options 中存在 data 屬性,我們才會繼續處理  if (options.data) {    initData(vm);  }}function initData(vm) {  var data = vm.$options.data;  // 把 data 數據單獨保存到 Vue 的實例化對象上,方便我們獲取  // 如果 data 是一個函數,我們需要執行返回得到返回的對象  data = vm._data = typeof data === "function" ? data.call(vm) : data || {};  // 遍歷 data 對象,通過 proxyData 對數據進行攔截  for (const key in data) {    // 傳入的參數分別是:當前實例、key值(也就是 vm._data)、data 中的 key 值(例如 vm._data.title)    proxyData(vm, "_data", key);  }  // 調用觀察者模式  observer(vm._data)}export {   initState};

以上代碼,我們通過proxyDatadata中的數據進行攔截,詳情如下:

// vue/proxy.jsfunction proxyData(vm, target, key) {  // 當訪問 vm.title 的時候轉換為 vm._data.title  //(請記住這句話?。。。? Object.defineProperty(vm, key, {    get: function () {      return vm[target][key];    },    set: function (newVal) {      vm[target][key] = newVal;    }  });}export default proxyData;

我們還調用了observer方法進行事件訂閱,詳細如下:

// vue/observe.jsimport Observer from "./observer"function observe(data) {  // 判斷只處理對象,如果不是對象直接返回  if (typeof data !== "object" || data === null) {    return false;  }  // 觀察數據  return new Observer(data)}export default observe;

核心文件vue/observer.js

接下來就是我們的核心文件vue/observer.js,該文件主要負責對數據類型進行判斷,如果是數組就需要單獨處理數組,這個我們后面再說:

// vue/observer.jsimport defineReactiveData from "./reactive";import { arrMethods } from "./array";import observeArr from "./observeArr";// 這個方法會在多個地方調用,請記住這個方法以它的作用function Observer(data) {  // 如果 data 是一個數組,那面需要單獨處理  if (Array.isArray(data)) {    // 給數組新增一層原型    data._proto__ = arrMethods;    // 循環數組的每一項,然后讓每一項都調用 Observer 方法進行訂閱    observeArr(data)  } else {    // 處理對象    this.walk(data);  }}Observer.prototype.walk = function (data) {  // 獲取到 data 全部的 key  // 也就是我們定義的 ["title", "classNum", "teacher", "info", "students"]  let keys = Object.keys(data);  for (var i = 0; i < keys.length; i++) {    let key = keys[i];    let value = data[key];    // 攔截 data 數據    // 分別傳入參數為:vm._data、data 中的 key、data 中 key 對應的 value    defineReactiveData(data, key, value);  }};export default Observer;

以上代碼,我們分別對數組和對象執行不同的操作,我們先來看對象的操作:

Observer構造函數中我們新增了一個walk方法,該方法獲取到了所有的key值,然后調用了defineReactiveData進行處理。

// vue/reactive.jsimport observe from "./observe";function defineReactiveData(data, key, value) {  // 例如 info.a 還是個對象,那么就遞歸觀察  observe(value);  // 這里的 data 是 vm._data,所以這里攔截的也是 vm._data  Object.defineProperty(data, key, {    get() {      console.log(`?? 響應式獲?。篸ata.${key},`, value);      return value;    },    set(newVal) {      console.log(`
標簽: JavaScript
主站蜘蛛池模板: 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 | 螺旋丝杆升降机-SWL蜗轮-滚珠丝杆升降机厂家-山东明泰传动机械有限公司 | 香蕉筛|直线|等厚|弧形|振动筛|香蕉筛厂家-洛阳隆中重工 | 电力测功机,电涡流测功机,磁粉制动器,南通远辰曳引机测试台 | 臭氧实验装置_实验室臭氧发生器-北京同林臭氧装置网 | 合肥触摸一体机_触摸查询机厂家_合肥拼接屏-安徽迅博智能科技 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 万家财经_财经新闻_在线财经资讯网 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 金蝶帐无忧|云代账软件|智能财税软件|会计代账公司专用软件 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | 123悬赏网_发布悬赏任务_广告任务平台| 体坛网_体坛+_体坛周报新闻客户端 | 成都办公室装修-办公室设计-写字楼装修设计-厂房装修-四川和信建筑装饰工程有限公司 | 证券新闻,热播美式保罗1984第二部_腾讯1080p-仁爱影院 | 周口市风机厂,周鼓风机,河南省周口市风机厂 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 涿州网站建设_网站设计_网站制作_做网站_固安良言多米网络公司 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 海日牌清洗剂-打造带电清洗剂、工业清洗剂等清洗剂国内一线品牌 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 北京公司注册_代理记账_代办商标注册工商执照-企力宝 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | 山东螺杆空压机,烟台空压机,烟台开山空压机-烟台开山机电设备有限公司 | 合肥礼品公司-合肥礼品定制-商务礼品定制公司-安徽柏榽商贸有限公司 | 商标转让-购买商标专业|放心的商标交易网-蜀易标商标网 | 凝胶成像系统(wb成像系统)百科-上海嘉鹏 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 包装机_厂家_价格-山东包装机有限公司 | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 |