成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

Vue2 中的數(shù)據(jù)劫持簡寫示例

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

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

我們今天要編寫的項目通過需要使用 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: {    // 表示解析模塊引入的時候先從當(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)

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

實例一個模擬的 Vue 應(yīng)用

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

// index.js// 我們在 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)前實例對象  var vm = this;  // 我們把 new Vue() 時候傳遞的數(shù)據(jù)統(tǒng)稱為 options  // 并且掛載到 Vue 的實例對象上  vm.$options = options;  // 調(diào)用 initState 初始化 data 數(shù)據(jù)  initState(vm);};export default Vue;

initState方法

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

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

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

// vue/proxy.jsfunction proxyData(vm, target, key) {  // 當(dāng)訪問 vm.title 的時候轉(zhuǎn)換為 vm._data.title  //(請記住這句話!!!)  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) {  // 判斷只處理對象,如果不是對象直接返回  if (typeof data !== "object" || data === null) {    return false;  }  // 觀察數(shù)據(jù)  return new Observer(data)}export default observe;

核心文件vue/observer.js

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

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

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

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

// 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(`?? 響應(yīng)式獲取:data.${key},`, value);      return value;    },    set(newVal) {      console.log(`
標(biāo)簽: JavaScript
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品不卡一区二区三区| 欧美在线一二三四区| 亚洲欧美日韩在线观看a三区| 免费精品视频在线| 日本一区免费视频| 免费亚洲一区二区| 久久99最新地址| 国产精品美女久久福利网站| 91久久线看在观草草青青| 你懂的一区二区| 国产永久精品大片wwwapp| 亚洲人精品午夜| www国产亚洲精品久久麻豆| 午夜宅男欧美| 91丨porny丨中文| 久国产精品韩国三级视频| 中文字幕第一区第二区| 欧美一卡二卡三卡| 美女国产一区| 欧美日本一区| 不卡视频免费播放| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲一区二区黄色| 亚洲天堂网中文字| 国产日韩欧美电影| 欧美一级xxx| 欧美一级一区| 亚洲人人精品| 欧美日韩视频一区二区三区| 粉嫩av亚洲一区二区图片| 日本不卡123| 一个色妞综合视频在线观看| 久久嫩草精品久久久精品| 欧美探花视频资源| 久久久久高清| 免费亚洲一区二区| 亚洲一区二区三区高清不卡| 很黄很黄激情成人| 91色婷婷久久久久合中文| 国产精品白丝jk白祙喷水网站| 久久99最新地址| 黄色资源网久久资源365| 麻豆高清免费国产一区| 日本不卡视频在线观看| 日韩中文字幕麻豆| 日本中文字幕不卡| 激情偷乱视频一区二区三区| 国产精品一二三四| 国产成人丝袜美腿| 国产91丝袜在线观看| 国产成人精品午夜视频免费| 欧美高清在线精品一区| 国产精品亚洲一区二区三区在线| 日韩欧美一区二区久久婷婷| 99久久国产综合精品女不卡| 国产精品嫩草99a| 亚洲欧美高清| 久久草av在线| 精品国产乱码久久久久久影片| 亚洲成人午夜影院| 丝袜国产日韩另类美女| 麻豆精品在线看| 国产成人啪免费观看软件| 成人性视频免费网站| 欧美在线影院| 亚洲视频久久| 99国产精品自拍| 色婷婷国产精品| 欧美一区二区三区免费在线看| 欧美一区二区三区不卡| 精品欧美一区二区三区精品久久 | 色激情天天射综合网| 欧美中文字幕一区二区三区亚洲| 91精品综合久久久久久| 久久久午夜精品理论片中文字幕| 国产人伦精品一区二区| 亚洲精品国产品国语在线app| 亚洲成人激情社区| 国产精品一二三在| 欧美日韩a区| 欧美亚一区二区| 国产午夜精品在线观看| 亚洲一区二区三区四区五区中文| 美腿丝袜亚洲三区| 91丝袜国产在线播放| 亚洲精品一区二| 欧美裸体一区二区三区| 99精品国产高清一区二区| 麻豆精品新av中文字幕| 久久久久成人黄色影片| 亚久久调教视频| 老汉av免费一区二区三区| 91在线视频免费观看| 国产精品视频免费观看| 欧美一区二区三区视频免费播放| 中文字幕在线免费不卡| 国产一区二区三区观看| 亚洲激情一区二区| 91精品国模一区二区三区| 综合久久给合久久狠狠狠97色| 久久精品久久综合| 伊人久久久大香线蕉综合直播| 欧美日韩在线亚洲一区蜜芽| 亚洲免费av高清| 成人av电影免费观看| 色视频成人在线观看免| 中文一区二区完整视频在线观看 | 日韩视频不卡| 久久人人爽人人爽| 日韩电影免费一区| 亚洲欧洲精品一区二区| 2020国产精品| 国产精品影音先锋| 乱人伦精品视频在线观看| 国产精品视频一区二区三区不卡| 国产麻豆午夜三级精品| 色婷婷久久久久swag精品| 1区2区3区精品视频| 成人黄色电影在线| 欧美精三区欧美精三区| 亚洲成av人片在www色猫咪| 91麻豆国产在线观看| 91精品在线麻豆| 婷婷激情综合网| 中日韩在线视频| 国产精品免费看片| 欧美粗暴jizz性欧美20| 久久夜色精品一区| 成人中文字幕合集| 欧美一级二级在线观看| 国产精品123| 制服丝袜在线91| 久久精品国产999大香线蕉| 日本道在线观看一区二区| 亚洲国产精品麻豆| 亚洲美女91| 中文字幕一区av| 欧美精品18| 欧美韩日一区二区三区四区| 91丨国产丨九色丨pron| 久久久久9999亚洲精品| 北条麻妃国产九九精品视频| 日韩一区二区三区视频在线| 国产曰批免费观看久久久| 555夜色666亚洲国产免| 国产综合久久久久影院| 欧美日韩国产a| 黄网站免费久久| 久久在线免费观看| 国内精品久久久久久久97牛牛| 亚洲精品视频免费看| 亚洲三级国产| 亚洲精品成人少妇| 国产亚洲一级| 午夜精品久久久久影视| 日本一区二区三区四区在线视频| 欧美久久久久中文字幕| 欧美视频在线一区| 欧美图区在线视频| 91福利国产精品| 色8久久精品久久久久久蜜| 久久精品男女| 亚洲欧美精品在线观看| 国产视频一区三区| 一区免费在线| 亚洲午夜精品久久久久久app| 99精品偷自拍| 波多野结衣中文字幕一区二区三区| 国产在线播精品第三| 欧美a级理论片| 亚洲愉拍自拍另类高清精品| 韩国理伦片一区二区三区在线播放| 欧美精品色网| 亚洲高清在线精品| 欧美欧美午夜aⅴ在线观看| 99在线精品视频| 亚洲一区中文日韩| 欧美色区777第一页| 国产麻豆精品在线观看| 蜜臀99久久精品久久久久久软件| 日本伊人精品一区二区三区观看方式| 亚洲电影视频在线| 欧美连裤袜在线视频| 欧美日韩国产片| 97久久精品人人做人人爽 | 9久草视频在线视频精品| 亚洲少妇30p| 欧美肥大bbwbbw高潮| 黄色日韩在线| 国产一二精品视频| 亚洲一区二区三区中文字幕 | 丁香桃色午夜亚洲一区二区三区| 久久久久久久久久电影| 蜜桃久久av| 成人av电影免费在线播放| 天堂av在线一区| 中文字幕一区二区三区在线播放| 欧美日韩国产小视频| 夜夜爽99久久国产综合精品女不卡| 精品一区二区久久久|