Size: a a a

2020 September 02

К

Константин in Svelte [svelt]
а лэйбл $ нигде не нужен?
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Константин
а лэйбл $ нигде не нужен?
все переменные в комопненте, которые let, используются в шаблоне или реактивном выражении и меняются где-то в компоненте, автоматически реактивные
источник

К

Константин in Svelte [svelt]
svelte ❤️
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
переменные const НЕ реактивные, потому что подразумевается что ты не хочешь их менять
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
причем svelte точно знает что происходит с той или иной переменной и если например она определена и НЕ используется, тогда никакой код делающий такую работу не продуцируется. или она используется, но НЕ меняется нигде, тогда она не отслеживается и тп
источник

К

Константин in Svelte [svelt]
теперь всё стало значительно понятнее!
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
однако нужно не забывать об особенностях статического анализа, на котором это все работает. самый простой способ понять это, представить что компилятор "смотрит" на код
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
поэтому вот такие штуки НЕ работают:

let arr = [{ a: 1 }, { a: 2 }, { a: 3 }];

function a(p, i) {
 return p[i];
}

let arr0 = a(arr, 0);


<button on:click={() => arr0.a++}>increment first</button>

{#each arr as n}
 {n.a}
{/each}
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
мы с тобой как бы можем мысленно интерпритировать код и понять, что в arr0 лежит ссылка на arr[0]
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
и по-сути это одно и тоже
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
но для статического анализа в билдтайме это невозможно, потому что он просто "смотрит" и не "видит" что arr меняется
источник

К

Константин in Svelte [svelt]
а я правильно понимаю, что реактивное переприсвоение здесь спасёт ситуацию?
что-то типа:

$: arr = arr, arr0.a
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Константин
а я правильно понимаю, что реактивное переприсвоение здесь спасёт ситуацию?
что-то типа:

$: arr = arr, arr0.a
не, тут просто надо ему "показать" что именно меняется:

<button on:click={() => arr[0].a++}>increment first</button>
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
то есть если хочешь, чтобы что-то связанное с arr было реактивным, то нужно именять именно arr, чтобы компилятор "видел" это статически
источник

К

Константин in Svelte [svelt]
да, но переприсвоение здесь не спасёт?
источник

К

Константин in Svelte [svelt]
понятно, что это так себе решение
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Константин
да, но переприсвоение здесь не спасёт?
arr0.a => arr[0].a
источник

К

Константин in Svelte [svelt]
просто технически интересно
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Константин
а я правильно понимаю, что реактивное переприсвоение здесь спасёт ситуацию?
что-то типа:

$: arr = arr, arr0.a
это выражение вообще не имеет смысла)
источник

К

Константин in Svelte [svelt]
там в примерах было что-то подобное с массивом
источник