[Day11] - 利用 Proxy 来监听资料的变化

connectedCallback 初始建立时 , 我们需要处理 html 如何呈现 在 attributeChangedCallback 属性变更时 , 根据不同的属性来做对应的处理

我们何不效仿 React 做出一个根据 data 的 render 函式 ,

建立 render 函式前 , 我们可能需要有一个元件的资料中心 ( React 是 this.state / Vue 是 )

然後资料变更时 , 会通知元件需要触发 render 函式

刚好浏览器中有个 Proxy 物件 , 可以达到 observe 资料 & 触发 render 的功能

下面我们先来认识一下 Proxy 物件吧 !

建构子

  • target : 需要 observe 的资料对象 ( 可以是 array . object 或 function )
  • handler : 包括 getter 跟 setter 方法 , 当 target 的资料改变时 , 会对应触发 handler 中的 getter . setter

范例

下面我们来举例说明一下

const handler = {

  // 取出资料时 , undefined 回传 "资料未定义~~"
  get: function (obj, prop) {
    return obj[prop] || '资料未定义~~';
  },

  // 更新的数值都 * 2
  set: function (obj, prop, newValue) {
    if (newValue) obj[prop] = 2 * newValue;
  }
};

const target = {};
const p = new Proxy(target, handler);
p.a = 1;
p.b = undefined;

console.log(p.a); // 2
console.log(target); // { a : 2 }
console.log(p.b); // '资料未定义~~'
console.log('c' in p, p.c); // false, '资料未定义~~'

图解

下面我们用图片来解说 , 上面的范例都发生了那些事情 ~

p.a = 1

设定 p.a 的时候 , 我们会将数值丢给 handler.set 函式做处理

并且 set 函式接收到的参数如下 :

  • obj = {} ( target 物件 )
  • prop = a ( 目前要设定的属性 )
  • newValue = 1 ( 目前要设定的数值 )

因为 newValue 存在 , 因此 handler.set 会将 target 物件改成 { a : 2 }

img.png

p.b = undefined

img_1.png

console.log(p.a)

取出 p.a 的时候 , Proxy 会透过 handler.get 函式做处理

并且 get 函式接收到的参数如下 :

  • obj = { a : 2 } ( target 物件 )
  • prop = a ( 目前要取出的属性 )

因为 obj[a] 存在 , 因此 handler.get 回传数值 2

img_2.png

console.log(p.b)

同理 , 取出 p.b 的时候 , Proxy 会透过 handler.get 函式做处理

并且 get 函式接收到的参数如下 :

  • obj = { a : 2 } ( target 物件 )
  • prop = b ( 目前要取出的属性 )

因为 obj[b] 不存在 , 因此 handler.get 回传字串 '资料未定义~~'

img_4.png

参考资料 :


<<:  D14: 工程师太师了: 第7.5话

>>:  Day5:类神经网路架构

最後一天~後面该如何

前面提了 一堆的内容 实务上呢? 我们可以用OpenCV和Python来实现一个人群计数器 为了实现...

DAY27-SQL语法(VIEW 实作)

建立虚拟资料表有两个方法,今天要来示范第一个方法,我已第四章报表作为范例: 首先我们,先在你所使用的...

[Day 10] .Net Task 底层(3)

前言 今天, 是系列文的小小里程碑, 我们终於在今天找出了 task 的其中一种非同步演算法。 他被...

谁喜欢这则贴文,初探 case...when 用法,Ruby 30 天刷题修行篇第十六话

嗨,我是 A Fei,让我们看看今天的题目: (题目来源:Codewars) You probabl...

[Day22] Esp32用STA mode + AHT10 - (程序码讲解)

1.前言 这边主要是为解说前几篇关於AHT10的程序码,此次主要讲的部分是loop中的程序码,因为透...