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

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

Vue2 中的數(shù)據(jù)劫持簡(jiǎn)寫(xiě)示例

瀏覽:271日期:2022-06-02 08:22:40
目錄
  • package.json 相關(guān)依賴
  • Webpack.config.js 配置文件
  • public/index.html 文件內(nèi)容
  • 全部文件目錄結(jié)構(gòu)
  • 實(shí)例一個(gè)模擬的 Vue 應(yīng)用
    • vue/index.js 文件主要是負(fù)責(zé)初始化內(nèi)容
    • initState方法
    • 核心文件vue/observer.js
    • vue/observer.js文件對(duì)數(shù)組進(jìn)行處理

package.json 相關(guān)依賴

我們今天要編寫(xiě)的項(xiàng)目通過(guò)需要使用 Webpack 進(jìn)行編譯,package.json 相關(guān)依賴如下:

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

public/index.html 文件內(nèi)容

<!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>

全部文件目錄結(jié)構(gòu)

好了,接下來(lái)我們就開(kāi)始發(fā)車!

實(shí)例一個(gè)模擬的 Vue 應(yīng)用

首先,我們需要編寫(xiě)我們的入口文件 index.js,該文件很普通主要就是實(shí)例一個(gè)模擬的 Vue 應(yīng)用:

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

vue/index.js 文件主要是負(fù)責(zé)初始化內(nèi)容

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

initState方法

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

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

以上代碼,我們通過(guò)proxyData對(duì)data中的數(shù)據(jù)進(jìn)行攔截,詳情如下:

// vue/proxy.jsfunction proxyData(vm, target, key) {  // 當(dāng)訪問(wèn) vm.title 的時(shí)候轉(zhuǎn)換為 vm._data.title  //(請(qǐng)記住這句話!!!)  Object.defineProperty(vm, key, {    get: function () {      return vm[target][key];    },    set: function (newVal) {      vm[target][key] = newVal;    }  });}export default proxyData;

我們還調(diào)用了observer方法進(jìn)行事件訂閱,詳細(xì)如下:

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

核心文件vue/observer.js

接下來(lái)就是我們的核心文件vue/observer.js,該文件主要負(fù)責(zé)對(duì)數(shù)據(jù)類型進(jìn)行判斷,如果是數(shù)組就需要單獨(dú)處理數(shù)組,這個(gè)我們后面再說(shuō):

// vue/observer.jsimport defineReactiveData from "./reactive";import { arrMethods } from "./array";import observeArr from "./observeArr";// 這個(gè)方法會(huì)在多個(gè)地方調(diào)用,請(qǐng)記住這個(gè)方法以它的作用function Observer(data) {  // 如果 data 是一個(gè)數(shù)組,那面需要單獨(dú)處理  if (Array.isArray(data)) {    // 給數(shù)組新增一層原型    data._proto__ = arrMethods;    // 循環(huán)數(shù)組的每一項(xiàng),然后讓每一項(xiàng)都調(diào)用 Observer 方法進(jìn)行訂閱    observeArr(data)  } else {    // 處理對(duì)象    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 數(shù)據(jù)    // 分別傳入?yún)?shù)為:vm._data、data 中的 key、data 中 key 對(duì)應(yīng)的 value    defineReactiveData(data, key, value);  }};export default Observer;

以上代碼,我們分別對(duì)數(shù)組和對(duì)象執(zhí)行不同的操作,我們先來(lái)看對(duì)象的操作:

Observer構(gòu)造函數(shù)中我們新增了一個(gè)walk方法,該方法獲取到了所有的key值,然后調(diào)用了defineReactiveData進(jìn)行處理。

// vue/reactive.jsimport observe from "./observe";function defineReactiveData(data, key, value) {  // 例如 info.a 還是個(gè)對(duì)象,那么就遞歸觀察  observe(value);  // 這里的 data 是 vm._data,所以這里攔截的也是 vm._data  Object.defineProperty(data, key, {    get() {      console.log(`?? 響應(yīng)式獲取:data.${key},`, value);      return value;    },    set(newVal) {      console.log(`
標(biāo)簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品高清不卡| 999国产精品视频| 91精品99| 91精品精品| 日韩一区电影| 欧美gv在线| 国产91精品对白在线播放| 久久久精品久久久久久96 | 美腿丝袜亚洲三区| 国产欧美日韩精品一区二区三区| 久久精品97| 美女精品久久| 国产精品二区不卡| 麻豆网站免费在线观看| 亚洲伊人av| 亚洲欧美伊人| 视频一区在线视频| 7777精品| 国产理论在线| 亚洲精品成人| 亚洲精品自拍| 在线日韩成人| 欧美日韩1区| 国产精品久久久久久久久久齐齐| 国产欧美日韩一区二区三区在线| 国产日韩一区二区三区在线播放| 久久精品超碰| 精品91福利视频| 久久国产免费| 欧美日韩视频| 日韩精品1区2区3区| 国产精品久久久久久久久免费高清 | 久久久久欧美精品| 一区在线视频观看| 亚洲午夜国产成人| 国产精品第一| 老牛影视精品| 女同性一区二区三区人了人一| 日韩在线一二三区| 国产精品igao视频网网址不卡日韩 | 蜜桃av一区二区在线观看| 国产精品久久久久久久久久齐齐 | 丝袜美腿一区| 在线一区二区三区视频| 精品视频一区二区三区在线观看 | 日本aⅴ亚洲精品中文乱码| 精品视频在线观看网站| 99亚洲视频| 欧美一级网站| 99视频精品全部免费在线视频| 日韩激情精品| 99精品在线免费在线观看| 日本伊人午夜精品| 日韩中文影院| 91精品在线免费视频| 欧美三级网址| 日韩高清在线一区| 天堂资源在线亚洲| 欧美片第1页综合| 欧美+日本+国产+在线a∨观看| 国产人成精品一区二区三| 视频福利一区| 国产精品亚洲一区二区在线观看| 成人va天堂| 欧美日一区二区三区在线观看国产免 | 91精品91| 久久99国产精品视频| 欧美综合国产| 日韩成人精品一区二区| 日韩国产欧美一区二区三区| 日韩不卡视频在线观看| 国产丝袜一区| 天堂成人国产精品一区| 激情久久99| 日韩精品三区四区| 婷婷色综合网| 福利视频一区| 日本精品另类| 性一交一乱一区二区洋洋av| а√在线中文在线新版| 久久国产乱子精品免费女| 久久国产66| 99久久99久久精品国产片果冰| 国产精品欧美大片| 天使萌一区二区三区免费观看| 久久久一本精品| 精品视频一区二区三区在线观看| 日韩精品1区2区3区| 亚洲精品中文字幕乱码| 鲁鲁在线中文| 精品网站999| 欧美在线观看天堂一区二区三区| 香蕉久久久久久久av网站| 久久国产亚洲精品| 成人在线丰满少妇av| 日韩极品在线观看| 亚洲男人在线| 美国三级日本三级久久99 | 视频一区二区中文字幕| 99久久精品国产亚洲精品| 四季av一区二区凹凸精品| 国产精品va| 国产精品日韩精品在线播放| 亚洲欧美网站在线观看| 久久国产88| 香蕉久久久久久久av网站| 欧美高清一区| 亚洲大全视频| 欧美一区二区三区激情视频| 麻豆mv在线观看| 黄色aa久久| 夜鲁夜鲁夜鲁视频在线播放| www.九色在线| 国产免费播放一区二区| 国产日韩三级| 国产乱论精品| 国产麻豆一区二区三区精品视频| 91亚洲无吗| 日精品一区二区三区| 亚洲精品日本| 日韩不卡一区二区三区| 88久久精品| 国产精品久久| 国产精品亚洲成在人线| 国产日韩欧美三区| 国产精品一站二站| 久久国际精品| 国产劲爆久久| 国产精品久久久久久久久久妞妞 | 中文欧美日韩| 久久午夜精品| 亚洲一区导航| 日韩精品视频中文字幕| 婷婷成人av| 91国内精品| 国产精久久久| av资源中文在线| 久久激情中文| 欧美a级一区| 激情欧美亚洲| 国产不卡精品在线| 国产色播av在线| 天堂资源在线亚洲| 亚洲美洲欧洲综合国产一区| 免费av一区| 好看不卡的中文字幕| 夜夜嗨网站十八久久 | 视频国产精品| 欧美日韩午夜电影网| 国产精品片aa在线观看| 国产一区二区三区黄网站| 樱桃视频成人在线观看| 99成人在线视频| 日本精品不卡| 午夜精品亚洲| 三级久久三级久久久| 欧美国产极品| 久久久久久久久久久9不雅视频| 日韩午夜黄色| 日韩一二三区在线观看| 麻豆久久久久久| 午夜久久中文| 99国产精品99久久久久久粉嫩| 欧美亚洲三区| 日韩av成人高清| 精品亚洲免a| 99久久久国产精品美女| 欧美女激情福利| 欧美日韩激情在线一区二区三区| 久久电影一区| 国产一区 二区| 不卡福利视频| 久久亚洲欧美| 久久99久久人婷婷精品综合| 深夜视频一区二区| 免费在线观看一区二区三区| 欧美偷窥清纯综合图区| 成人一二三区| 老鸭窝毛片一区二区三区| 欧美日韩国产一区二区在线观看| 国产一区二区三区精品在线观看| 欧美日韩国产在线观看网站 | 中文字幕乱码亚洲无线精品一区| 欧美一级二级视频| 六月婷婷综合| 免费在线观看视频一区| 免费亚洲一区| 亚洲一区欧美激情| 国产精品久一| 伊人久久亚洲热| 美女精品视频在线| 亚洲精品一二三区区别| 国产亚洲久久| 国产99久久| 国产精品色在线网站| 亚洲欧洲一区| 亚洲精品免费观看| www.com.cn成人| 日韩精品免费视频一区二区三区 | 亚洲欧美日韩视频二区|