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

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

Vue2 中的數據劫持簡寫示例

瀏覽:274日期: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(`?? 響應式獲取:data.${key},`, value);      return value;    },    set(newVal) {      console.log(`
標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩高清一区二区三区在线 | 国产一区白浆| 日韩国产在线一| 亚洲不卡视频| 伊人精品在线| 99久久久久国产精品| aa亚洲婷婷| 国产精品视频一区二区三区| 国产高清久久| av免费不卡国产观看| 国产午夜精品一区在线观看| 精品日韩视频| 日本va欧美va精品发布| 91精品一区国产高清在线gif| 欧美中文字幕一区二区| 日韩va亚洲va欧美va久久| 久久av导航| 国产字幕视频一区二区| 亚洲色图综合| 青青草91视频| 香蕉成人久久| 香蕉久久国产| 美女精品网站| 国产精品一区三区在线观看| 九九99久久精品在免费线bt| 天堂av在线| 一区二区三区网站| 久久97久久97精品免视看秋霞| 久久精品99久久无色码中文字幕| 99国产成+人+综合+亚洲欧美| 国产欧美亚洲一区| 日韩毛片一区| 免费在线小视频| 日韩中文欧美在线| 日产午夜精品一线二线三线| 午夜欧美理论片| 国产精品白丝久久av网站| 麻豆一区在线| 日韩在线播放一区二区| 国产精品对白久久久久粗| 中文字幕av一区二区三区人| 欧美天堂亚洲电影院在线观看| 午夜影院欧美| 国产欧美在线| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品hd| 亚洲精品女人| 国产一区二区三区亚洲综合| 91精品国产调教在线观看 | 亚洲精品亚洲人成在线观看| 日韩高清中文字幕一区二区| 国产色综合网| 亚洲国产一区二区三区在线播放| 国产成人精品一区二区三区视频 | 麻豆精品少妇| 日本精品在线播放| 国产+成+人+亚洲欧洲在线| 国产精品97| 黄色在线观看www| 麻豆成人在线| 91亚洲一区| 欧美偷窥清纯综合图区| 中文精品视频| 日本不卡高清| 91精品麻豆| 丁香婷婷久久| 国产精品毛片在线| 91精品国产自产精品男人的天堂| 精品一区电影| 亚洲男女av一区二区| 日日夜夜免费精品视频| 久久天堂影院| 亚洲一区欧美二区| 精品在线网站观看| 成人精品亚洲| 91九色精品| www.九色在线| 国产精品视频一区视频二区| 亚洲v在线看| 久久精品国产一区二区| 国产精品88久久久久久| 伊人久久亚洲影院| 日日摸夜夜添夜夜添国产精品| 国产精品自拍区| 秋霞影视一区二区三区| 亚洲在线免费| 高清一区二区三区| 欧美福利专区| 国产精品日本一区二区不卡视频 | 福利一区和二区| 99视频精品免费观看| 欧美网站在线| 亚久久调教视频| 欧美一区久久| 麻豆国产精品| 日韩精品第一区| 亚洲a一区二区三区| 成人免费电影网址| 一区二区自拍| 日本在线不卡视频| 亚洲精品高潮| 国产欧美三级| 麻豆成人av在线| 亚洲成人va| 蜜臀久久久久久久| 久久激情综合网| 91一区二区| 免费看的黄色欧美网站| 视频一区中文字幕精品| 国产精品99久久久久久董美香| 日韩av二区| 亚洲大全视频| 欧美日韩一视频区二区| 日韩88av| 亚洲精品一区二区在线看| 99国产精品久久久久久久成人热| 日本在线观看不卡视频| 高清精品久久| 久久国产精品毛片| 久久精品凹凸全集| 国模 一区 二区 三区| 911亚洲精品| 蜜桃传媒麻豆第一区在线观看| 国产高清一区二区| 国内精品99| 亚洲91精品| 亚洲大片在线| 99久久99久久精品国产片果冰| av最新在线| 肉色欧美久久久久久久免费看| 日本少妇精品亚洲第一区| 日欧美一区二区| 青草综合视频| 久久久久久久久丰满| 日本一区福利在线| 久久不卡国产精品一区二区| 福利视频一区| 欧美+亚洲+精品+三区| 中文亚洲免费| 91九色综合| 日韩欧美自拍| 日韩中文字幕视频网| 久久亚洲道色| 久久性天堂网| 久久精品国产99国产| 久久精品系列| 另类av一区二区| 精品国产鲁一鲁****| 99国产精品99久久久久久粉嫩| 国产精品欧美三级在线观看 | 免费精品视频最新在线| 97久久超碰| 婷婷综合激情| 精品国产欧美日韩一区二区三区| 99国产精品| 日韩av自拍| 在线亚洲一区| 国产一区二区视频在线看| 久久亚洲色图| 欧美~级网站不卡| 精品久久久久中文字幕小说| 三级久久三级久久久| 日本久久成人网| 国内揄拍国内精品久久| 视频一区视频二区中文| 日韩一区自拍| 久久一区欧美| 欧美日韩网址| 一区二区精品| 蜜桃一区二区三区在线观看| 成人在线免费观看91| 亚洲精品影视| 久热re这里精品视频在线6| 久久天堂精品| 欧美一区二区三区激情视频| 亚洲免费福利| 国产精品毛片一区二区在线看| 国产精品久久久久久久免费软件| 午夜日韩在线| 不卡一区综合视频| 欧美日韩国产亚洲一区| 91精品xxx在线观看| 欧美三级网址| 国产美女高潮在线| 日韩久久视频| 欧美高清不卡| 欧美日韩精品免费观看视欧美高清免费大片 | 视频二区不卡| 高清一区二区| 久久国产免费| 在线观看免费一区二区| 视频在线观看一区| 日韩精品一二三| 日本欧美韩国一区三区| 久久精品国产一区二区| 日韩啪啪电影网| 视频一区中文字幕国产| 国产欧美日韩亚洲一区二区三区| 日本一区二区免费高清| 在线视频精品|