Mobx последовательное получение вычисленных значений производит разные ссылки - PullRequest
0 голосов
/ 26 сентября 2019
class Store {
    @computed get staticItems(): number[] {
        return [1, 2, 3]
    }
}

describe('mobx', () => {
    it('computed static items should be same', (done) => {
        let store = new Store();
        let items = store.staticItems;
        setTimeout(() => {
            expect(items).toBe(store.staticItems);
            done()
        }, 500);
    });
})

Тестирование с jest throws

Expected: [1, 2, 3]
    Received: serializes to the same string

      50 |         let items = store.staticItems;
      51 |         setTimeout(() => {
    > 52 |             expect(items).toBe(store.staticItems);

Этот тест проходит с toEqual, но не с toBe, что означает, что обе ссылки указывают на разные объекты.Что мне не хватает?Работая с реагировать, это изменит ненужные реквизиты для дочернего компонента.

1 Ответ

1 голос
/ 26 сентября 2019

Вычисленные значения MobX автоматически приостанавливаются, если они не используются внутри реакции.Из документации :

Эта автоматическая подвеска очень удобна.Если вычисленное значение больше не наблюдается, например, пользовательский интерфейс, в котором оно использовалось, больше не существует, MobX может автоматически собрать его.Это отличается от значений autorun, где вы должны ими распоряжаться самостоятельно.Иногда это сбивает с толку новичков в MobX: если вы создаете вычисляемое свойство, но нигде не используете его в реакции, оно не будет кэшировать его значение и пересчитывать чаще, чем кажется необходимым.Тем не менее, в реальных ситуациях это, безусловно, лучший вариант по умолчанию, и вы всегда можете принудительно сохранить вычисленное значение, если вам нужно, используя либо observe, либо keepAlive.

.
...