Так что вот несколько вещей и случаев. Я изменил функцию дампа ниже, чтобы симулировать изменения
variations = [
{foo: 'bar'},
{foo: 'bar'},
{foo: 'bar2' },
{foo: 'bar2' },
{foo: 'bar2', bar: {name: "zoo"} },
{foo: 'bar2', bar: {name: "zoo"} },
{foo: 'bar2', bar: {name: "zoo2"} },
{foo: 'bar2', bar: {name: "zoo2"} },
{foo: 'barnew', bar: {name: "zoo2", new: "yes"} },
{foo: 'barnew', bar: {name: "zoo2", new: "no"} },
{foo: 'barnew', bar: {name: "zoo2", new: "no"} }
]
i=0;
dump = () => {
i++;
i = i%variations.length;
console.log("Changing data to ", variations[i]);
store.replaceFromDump(variations[i])
}
Использование exteObservable
Теперь, если вы используете код ниже
replaceFromDump(newData) {
extendObservable(this.data, newData)
}
И запустить его через цикл дампа, вывод ниже
Событие для bar
не начнет расти, пока вы не получите изменение на foo
, которое происходит при изменении ниже
{foo: 'barnew', bar: {name: "zoo2", new: "yes"} },
Результат: новые ключи могут наблюдаться только при изменении существующих наблюдаемых ключей
Использование карты
В этом мы меняем код как показано ниже
@observable data = map({
foo: 'bar'
})
replaceFromDump(newData) {
this.data.merge(newData)
}
Результат: данные только для слияния и не будут удалены. Вы также получите повторяющиеся события, так как это опция только слияния
Использование объекта Diff
Вы можете использовать библиотеку объектов diff, как показано ниже
https://github.com/flitbit/diff
Вы можете обновить код, как показано ниже
@observable data = {
foo: 'bar'
}
replaceFromDump(newData) {
if (diff(mobx.toJSON(this.data), newData)){
this.data = newData;
}
}
Результат: события происходят только при изменении данных, а не при переназначении одному и тому же объекту
Использование различий и применение различий
Используя ту же библиотеку, которую мы использовали ранее, мы можем применить только необходимые изменения
Если мы изменим код, как показано ниже
replaceFromDump(newData) {
observableDiff(toJSON(this.data), newData, d => {
applyChange(this.data, newData, d);
})
}
Если запустить вышеуказанное, мы получим следующий вывод
Результат: наблюдаются только изменения в исходном наборе ключей, если вы не удаляете их в ключах между
Это также дает вам разницу в формате ниже
{"kind":"E","path":["foo"],"lhs":"bar2","rhs":"barnew"}
{"kind":"N","path":["bar","new"],"rhs":"yes"}
Это означает, что вы можете лучше контролировать вещи, основываясь на именах полей, когда захотите
Ниже приведена скрипта, которую я использовал, большинство комментариев прокомментировано, но на случай, если вам нужно взглянуть на использование импорта ниже
https://jsfiddle.net/tarunlalwani/fztkezab/1/