js监听对象或属性变化

  1. ES55 的 getter和setter
  2. ES6 proxy
  3. 数据脏检查

对象的属性类型

  1. [[Value]]: 属性的值, 默认为undefined

使用 on-change库监听js变化

on-change库监听js变化

js监听对象或属性变化

  1. ES55 的 getter和setter
  2. ES6 proxy
  3. 数据脏检查

对象的属性类型

  1. [[Value]]: 属性的值, 默认为undefined

on-change库监听js变化

on-change提供了一个简单的监听对象(Object)或数组(Array)的属性变化,on-change可以监听任务深度的属性变化,如obj.a.b[0].c = true

安装

$ npm isntall -S on-change
# 或者
$ yarn add on-change

基本用法

// 创建一个需要监听的对象
    const object = {
        foo: false,
        a: {
            b: [
                {
                    c: false
                }
            ]
        }
    };


// 此处返回一个监听对象
const watchedObject = onChange(object, function (path, value, previousValue) {
    console.log('this:', this);  // Proxy {foo: true, a: {…}}
    console.log('path:', path);  // path: a.b.0.c
    console.log('value:', value);  // value: true
    console.log('previousValue:', previousValue);  // previousValue: false
});

// 我们现在改变任意的属性的值, 将会触发回调,输出如上注释
watchedObject.a.b[0].c = true;

参数及方法

onChange方法的参数

onChange(object, onChange, options?)

被监听的返回对象与原对象一样,只是添加了代理

参数1: object

必传,需要被监听对象,可以是object也可以是array

参数2: 回调函数onChange

该函数会在被监听对象属性发生改变时调用,回调函数接受三个参数

  1. path :已更改值的路径,如上a.b.0.c
  2. value:在此路径上,新的值
  3. previousValue:此路径上,上一次的值

例如:

const watchedObject = onChange(object, function (path, value, previousValue) {
    console.log('this:', this);  // 这里的 this 指向代理对象
    console.log('path:', path);  // 已经个更改值的路径
    console.log('value:', value);  // 此路径上的新值
    console.log('previousValue:', previousValue);  // 此路径上,上一次的值
});

参数3: options?

  • isShallow:boolean类型,默认值为false,如果设置为true,深度属性改变不会触发回调,只有改变原始对象直接属性才会触发回调;
  • equals:接受一个函数,默认为Object.is,接受两个参数就行比较,如果相等返回true,如果需要更宽松的比较方式,可以设置这个参数
  • ignoreSymbols:设置Symbo类型的属性是否不处罚回调,默认为false; 设置为true,则不触发回调
  • ignoreKeys:Array<string | symbol> 数组类型,此数组内的属性值修改不会触发回调
  • ignoreUnderscores:忽略下滑线的属性,默认为false
  • pathAsArray:boolean,默认为fasle,输出为a.b.0.c 这种形式,设置为true,则路径用数组表示

onChange.target(object)

返回未监听原始对象

onChange.unsubscribe(object)

取消被监听对象的所有回调,并返回原始对象

例子

有些代码可能如下,每次改变属性需要保存修改的对象

const foo = {
    a: 0,
    b: 0
};

// …

foo.a = 3;
save(foo); // 保存对象,或者其他操作

// …

foo.b = 7;
save(foo); // 保存对象,或者其他操作


// …

foo.a = 10;
save(foo); // 保存对象,或者其他操作

现在使用on-change就可以简化如下代码

const foo = onChange({
    a: 0,
    b: 0
}, () => save(foo));

// …

foo.a = 3;

// …

foo.b = 7;

// …

foo.a = 10;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容