Как отменить обновление() в магазине Svelte?

Магазины Svelte можно обновлять с помощью метода store.update().

store.update((currentValue) => {
  return currentValue + 1;
});

Можно ли отменить обновление в самой функции обновления, чтобы не срабатывали подписчики на магазин?

Например, мы можем захотеть ввести некоторую логику, чтобы решить, следует ли запускать и обновлять подписчикам или нет.

store.update((currentValue) => {
  // this doesn't work because it sets the value of the store to undefined
  if (currentValue >= 10) return;
  return currentValue + 1;
});

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

if (get(store) < 10) {
  store.update((currentValue) => {
    return currentValue + 1;
  });
}

Есть ли другое решение этой проблемы?

Ваш второй фрагмент кода будет работать, если вы просто вернете currentValue из оператора if: if (currentValue >= 10) return currentValue;

JHeth 21.02.2023 21:15

@JHeth нет, потому что это все равно вызовет обновление независимо от возвращаемого значения.

Pier 21.02.2023 21:25

Имеет значение, если значение является примитивным 🔁 svelte.dev/repl/f2a0f56a630f4e0ca7cc8812fac939fd?version=3.5‌​5.1

Corrl 21.02.2023 22:44

@Коррл, интересно. К сожалению, мне это нужно для не примитивных значений.

Pier 21.02.2023 23:58
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему &apos;[] instanceof Object&apos; возвращает &quot;true&quot;?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
0
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете либо написать собственное хранилище, реализующее эту логику, либо использовать отдельную функцию для обновления хранилищ. update в любом случае это просто служебная функция, которая не должна существовать в магазинах для работы.

Например. последний подход:

import { get } from 'svelte/store';

export class Cancel extends Error {}

export const cancel = () => { throw new Cancel() };

export function update(store, callback) {
    const value = get(store);
    try {
        const newValue = callback(value);
        store.set(newValue);
    }
    catch (e) {
        if (e instanceof Cancel)
            return;
        
        throw e;
    }
}

Использование:

update(store, value => {
    if (value == 10)
        cancel();
    
    return value + 1;
})

(Функция cancel также может быть передана обратному вызову в качестве другого аргумента.)

РЕПЛ

Другие вопросы по теме