Size: a a a

2020 October 12

PM

Pavel 🦇 Malyshev in Svelte [svelt]
но крутануть нормально чисто императивный  class-based/наследование код того же Phaser на чисто декларативный компонентный композиционный код Svelte - ничего хорошего не выйдет точно
источник

n

neadmin in Svelte [svelt]
все красиво и структурировано на svelte,

хочется просто избавиться от некоторого дублирования кода
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
neadmin
все красиво и структурировано на svelte,

хочется просто избавиться от некоторого дублирования кода
если вы выкидываете наверх свелт компонентов инстансы GO и дергаете их методы снаружи это уже не классный код свелт )
источник

PM

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

const go = new GO({ ... });

export let foo;

$: go.doSomething(foo)
источник

n

neadmin in Svelte [svelt]
так и есть - все рулится через flux
источник

n

neadmin in Svelte [svelt]
другое дело, что скорость низкая:
1) возьми данные
2) преобразуй
3) отдай компоненты
4) компонент отдает либе
5) либа преоразует во внутренний формат
6) либа рендерит

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

n

neadmin in Svelte [svelt]
и оно даже работает, и шустро работает
источник

n

neadmin in Svelte [svelt]
другое дело, что это уже не чистый компонентный подход декларируемый svelte, тут я согласен
источник

n

neadmin in Svelte [svelt]
но это не отменяет моего вопроса
как в onMount / onDestroy выполнять одни и те же действия, но контексте конкретного компонента?

тот же проброс событий из либы наружу компоненты - одна строчка кода, абсолютно одинаковая у всех копонентов, но зависит от внутренней константы компонентов - списка событий

причем есть группы копонентов у которых и этот список событий одинаков
источник

n

neadmin in Svelte [svelt]
как это решить без наследования?
источник

n

neadmin in Svelte [svelt]
ведь, как мне кажется, с такой задачей сталкивались практически все
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
neadmin
как это решить без наследования?
Композиция компонентов это не про то, чтобы сэкономить действия, а про расширение функционала одних компонентов по средствам оберток над ними,  аля HOC. Касательно вопроса, можешь вынести комбинацию onMount возвращаемый коллбек для onDestroy в отдельный js файл, там описать что надо и импортировать в тех компонентах где надо:

// life-cycle.js

import { onMount } from 'svelte';

export function mount(...args) {
    onMount(() => {
        // do something

        return () => {
            // clear something
        };
   });
}
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
в компоненте

import { mount } from './life-cycle.js';

mount();
источник

PM

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

PM

Pavel 🦇 Malyshev in Svelte [svelt]
можно еще глянуть в сторону setContext/getContext в качестве простенького DI
источник

МТ

Марк Танащук... in Svelte [svelt]
Кстати на счёт контекстов
источник

МТ

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

МТ

Марк Танащук... in Svelte [svelt]
Чтобы когда в родительском App.svelte сетился контекст все дочерние заново его получали
источник

МТ

Марк Танащук... in Svelte [svelt]
По моим поискам - нельзя без стора, но может что-то упустил
источник

DK

Dan Kozlov in Svelte [svelt]
Марк Танащук
По моим поискам - нельзя без стора, но может что-то упустил
Нет, контексты не реактивны и собираются не в рантайме.
источник