Size: a a a

2020 September 17

КС

Кирилл Спасибович... in Svelte [svelt]
кумарят конечно такие приколы на самом деле
источник

МТ

Марк Танащук... in Svelte [svelt]
Марк Танащук
Встретился ровно только что с багом - если биндить реактивность на массиве то срабатывает дважды функция:

<script>
function animate() { code }

let nodes = [];
$: nodes && animate(); // или animate(nodes);
</script>

{#each nodes as arr, i}
 <div bind:this={nodes[i]}></div>
{/each}
Неправильно немного баг описал...

Nodes это просто массив нод, а each итерирует над другой переменной:

<script>
export let array;

function animate() { code }

let nodes = [];
$: nodes && animate(); // или animate(nodes);
</script>

{#each array as arr, i}
 <div bind:this={nodes[i]}></div>
{/each}
источник

МТ

Марк Танащук... in Svelte [svelt]
Ну в общем я нашел способ который также вроде работает - сравнивать длину nodes и длину array

$: if(nodes.length == array.length) animate()
источник

МТ

Марк Танащук... in Svelte [svelt]
Срабатывает единожды стабильно
источник

КС

Кирилл Спасибович... in Svelte [svelt]
Марк Танащук
Ну в общем я нашел способ который также вроде работает - сравнивать длину nodes и длину array

$: if(nodes.length == array.length) animate()
я тебе его выше предлагал) тока я не знал что у тебя массив а не объект)
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Константин
замутите сначала эррор баундари, передачу классов и svelte:fragment )) 😜
Кажется ты не уловил умора 🤔
источник

КС

Кирилл Спасибович... in Svelte [svelt]
@PaulMaly я вот баловался тут двухсторонними биндингами, когда расширял базовый компонент функционалом сверху (делал обёртку)
и в режиме мутабельности получается, что когда происходит изменение - оно триггерит $: два раза, видимо один раз изменения отправляются биндом наверх, а раз они отправились наверх, то и вниз надо - раз это и всё-таки пропс для компонента, а что изменилось - неизвестно, т.к. safe_not_equal

это адекватное поведение, или в идеале бы такое пофиксить ?

я решил использованием options:immutable в оборачиваемом компоненте
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Марк Танащук
Встретился ровно только что с багом - если биндить реактивность на массиве то срабатывает дважды функция:

<script>
function animate() { code }

let nodes = [];
$: nodes && animate(); // или animate(nodes);
</script>

{#each nodes as arr, i}
 <div bind:this={nodes[i]}></div>
{/each}
по-идее должно срабатывать на любое изменение массива nodes
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
то есть при добавлении каждого элемента в массив
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Марк Танащук
Ну в общем я нашел способ который также вроде работает - сравнивать длину nodes и длину array

$: if(nodes.length == array.length) animate()
ну да норм, кажется это довольно очевидно
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Кирилл Спасибович
@PaulMaly я вот баловался тут двухсторонними биндингами, когда расширял базовый компонент функционалом сверху (делал обёртку)
и в режиме мутабельности получается, что когда происходит изменение - оно триггерит $: два раза, видимо один раз изменения отправляются биндом наверх, а раз они отправились наверх, то и вниз надо - раз это и всё-таки пропс для компонента, а что изменилось - неизвестно, т.к. safe_not_equal

это адекватное поведение, или в идеале бы такое пофиксить ?

я решил использованием options:immutable в оборачиваемом компоненте
хорошо бы конечно, чтобы это срабатывало умнее, но как ты верно заметил это практически неизбежное поведение при той системе реактивности, которая используется - когда связанные данные фактически присутствуют в нескольких местах и синхронизируются друг с другом
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
вообще у меня immutable на все приложение стоит всегда
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
не уверен зачем в свелт использовать мутабильность
источник

КС

Кирилл Спасибович... in Svelte [svelt]
Pavel 🦇 Malyshev
не уверен зачем в свелт использовать мутабильность
чтобы меньше кода писать наверное ?
так то я тоже к этому прихожу, что иммутабельность прикольнее, оно просто проверит ссылки по объектам и массивам, и в поля лезть не будет, и триггерить afterUpdate тоже не будет
ну и в принципе держать методы по работе с данными лучше рядом с данными в кастомном сторе и в них направлять апдейты из вьюхи
тогда и вербозность иммутабельности не так печалит, ибо всё это в отдельном store.js, а не в теле компонента
перестал нравится подход - компонент, показывающий объект из массива меняет этот объект мутабельно в коде своего скрипта
источник

КС

Кирилл Спасибович... in Svelte [svelt]
@PaulMaly а ты используешь Immer? или спредишь объекты и массивы на несколько уровней, когда надо что-то поменять? или стараешься делать структуру максимально плоской ?
источник

AP

Alexander Ponomarev in Svelte [svelt]
насколько я понял immutable в свелте делает equals для пропсов, но не влияет на внутренности компонентов
источник

К

Константин in Svelte [svelt]
Pavel 🦇 Malyshev
Кажется ты не уловил умора 🤔
уловил ) это была ирония. Просто отсутствие тайпскрипта было наименьшей проблемой свелт. В отличие от остального, без чего пиарить свелт как самый-лучший-в-мире-фрэймворк если не полностью бессмысленно, то, по крайней мере, слегка рановато )
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Кирилл Спасибович
@PaulMaly а ты используешь Immer? или спредишь объекты и массивы на несколько уровней, когда надо что-то поменять? или стараешься делать структуру максимально плоской ?
в основном юзаю встроенные методы языка + да, стараюсь делать структуру более плоской. immer тоже активно использовал и даже советовал, но чет он мне по перформансу не понравился в итоге
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
но immer довольно удобная штука
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Alexander Ponomarev
насколько я понял immutable в свелте делает equals для пропсов, но не влияет на внутренности компонентов
да, просто позволяет не тригерить лишнего
источник