js監(jiān)聽對象或?qū)傩宰兓?/h2>
  1. ES55 的 getter和setter
  2. ES6 proxy
  3. 數(shù)據(jù)臟檢查

對象的屬性類型

  1. [[Value]]: 屬性的值, 默認(rèn)為undefined

使用 on-change庫監(jiān)聽js變化

on-change庫監(jiān)聽js變化

js監(jiān)聽對象或?qū)傩宰兓?/h1>
  1. ES55 的 getter和setter
  2. ES6 proxy
  3. 數(shù)據(jù)臟檢查

對象的屬性類型

  1. [[Value]]: 屬性的值, 默認(rèn)為undefined

on-change庫監(jiān)聽js變化

on-change提供了一個簡單的監(jiān)聽對象(Object)或數(shù)組(Array)的屬性變化,on-change可以監(jiān)聽任務(wù)深度的屬性變化,如obj.a.b[0].c = true

安裝

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

基本用法

// 創(chuàng)建一個需要監(jiān)聽的對象
    const object = {
        foo: false,
        a: {
            b: [
                {
                    c: false
                }
            ]
        }
    };


// 此處返回一個監(jiān)聽對象
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
});

// 我們現(xiàn)在改變?nèi)我獾膶傩缘闹? 將會觸發(fā)回調(diào),輸出如上注釋
watchedObject.a.b[0].c = true;

參數(shù)及方法

onChange方法的參數(shù)

onChange(object, onChange, options?)

被監(jiān)聽的返回對象與原對象一樣,只是添加了代理

參數(shù)1: object

必傳,需要被監(jiān)聽對象,可以是object也可以是array

參數(shù)2: 回調(diào)函數(shù)onChange

該函數(shù)會在被監(jiān)聽對象屬性發(fā)生改變時調(diào)用,回調(diào)函數(shù)接受三個參數(shù)

  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);  // 已經(jīng)個更改值的路徑
    console.log('value:', value);  // 此路徑上的新值
    console.log('previousValue:', previousValue);  // 此路徑上,上一次的值
});

參數(shù)3: options?

  • isShallow:boolean類型,默認(rèn)值為false,如果設(shè)置為true,深度屬性改變不會觸發(fā)回調(diào),只有改變原始對象直接屬性才會觸發(fā)回調(diào);
  • equals:接受一個函數(shù),默認(rèn)為Object.is,接受兩個參數(shù)就行比較,如果相等返回true,如果需要更寬松的比較方式,可以設(shè)置這個參數(shù)
  • ignoreSymbols:設(shè)置Symbo類型的屬性是否不處罰回調(diào),默認(rèn)為false; 設(shè)置為true,則不觸發(fā)回調(diào)
  • ignoreKeys:Array<string | symbol> 數(shù)組類型,此數(shù)組內(nèi)的屬性值修改不會觸發(fā)回調(diào)
  • ignoreUnderscores:忽略下滑線的屬性,默認(rèn)為false
  • pathAsArray:boolean,默認(rèn)為fasle,輸出為a.b.0.c 這種形式,設(shè)置為true,則路徑用數(shù)組表示

onChange.target(object)

返回未監(jiān)聽原始對象

onChange.unsubscribe(object)

取消被監(jiān)聽對象的所有回調(diào),并返回原始對象

例子

有些代碼可能如下,每次改變屬性需要保存修改的對象

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

// …

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

// …

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


// …

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

現(xiàn)在使用on-change就可以簡化如下代碼

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

// …

foo.a = 3;

// …

foo.b = 7;

// …

foo.a = 10;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容