Магазины 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;
});
}
Есть ли другое решение этой проблемы?
@JHeth нет, потому что это все равно вызовет обновление независимо от возвращаемого значения.
Имеет значение, если значение является примитивным 🔁 svelte.dev/repl/f2a0f56a630f4e0ca7cc8812fac939fd?version=3.55.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
также может быть передана обратному вызову в качестве другого аргумента.)
Ваш второй фрагмент кода будет работать, если вы просто вернете
currentValue
из оператора if:if (currentValue >= 10) return currentValue;