декларация. Это чтобы описать какую-то сложную зависимость несколькими инструкциями. Вот что я имею ввиду.
$: marker = (() => {
if (!$article) return;
return $items.find(item => {
return item.articles.includes($article!);
});
})();
Я знаю, что в свелте переменные реактивны, так что можно сделать так:
let marker: Item | undefined;
$: {
if (!$article) return;
const _marker = $items.find(item => {
return item.articles.includes($article!);
});
if (_marker) marker = _marker;
}
Какие есть аргументы в пользу каждой сторон? Второй выглядит более свелт-вей, но насколько я знаю, компилятор преобразует всякие реактивные штуки в элементы "контекста", и при изменении реактивной штуки мутируют контекст и оповещают об этом всех. Так как это не нативные переменные JS, это медленнее. В этом и преимущество горячо любимого тут компилятора Malina, что он эмитит обычные переменные, кажется. Так вот, во втором случае в контекст будет попадать два элемента, вместо одного. Будет от этого приложение намного больше и медленнее? И имеет ли эта разница значения?
Честно говоря, разница окажется настолько минимальной, что выходит непрактичным выбирать по перфомансу. Надо выбирать по тому, что лучше читается (имхо, второе) или что просто больше нравится. Но тут, кажется, можно выражение упростить, чтоб была просто реактивная переменная. $: marker = $items.find(item => item.articles.includes($article)) ?? marker
Спасибо. Мне больше нравится первый вариант. Все вычисления скрываются в небольшом иммедиейте. Насчёт самого примера кода... Я не захотел записать всё в одну строку, так как не хотел использовать non-null assertion лишний раз. Параметр у Array#includes является non-nullable, в отличии от значения стора, хотя для includes null-безопасность совсем важна. Поэтому я написал if, который в обычном тайпскрипте был бы тайп-гардом, но это не сработало, наверное, из-за $. Так что получилось, что !-оператор всё равно пришлось применить. Моя невнимательность.
А чем это лучше $: marker = $article && $items.find(item => item.articles.includes($article)); ?
Нет фолбэка на старый маркер! 🙂
Обсуждают сегодня