Size: a a a

2020 December 21

ON

Oleg N in Svelte [svelt]
Dan Kozlov
В реакте нет ивентов ж. Там как раз эту проблему решить проще простого, ты получил в пропсах коллбэк и к какому элементу его присобачил, с тем он и работает.
тут тоже самое, только отделено синтаксисом
источник

AP

Alexander Ponomarev in Svelte [svelt]
Dan Kozlov
Проблема on:* в том, что ты не знаешь, к чему родитель подсоединится. Одно дело, когда у тебя есть очевидный dispatch('click'), другое — когда у тебя на все on:* будет навешиваться листенер от родителя, ну и ты там уже в родителе проводи тысячу проверок, чтобы убедиться, что у тебя пришло нормальное событие, а не мусор какой-то.
вопрос документирования интерфейса ребенка
источник

DK

Dan Kozlov in Svelte [svelt]
Oleg N
тут тоже самое, только отделено синтаксисом
Так нет же. Я так понимаю, что у тебя при любых раскладах все подписки родителей будут подписываться на все on:* в ребёнке.
источник

DK

Dan Kozlov in Svelte [svelt]
Alexander Ponomarev
вопрос документирования интерфейса ребенка
Как можно задокументировать такую фигню?
CustomEvent<void> | Event<any>? Если у тебя любая подписка может улететь в любой элемент, который может зафайрить его, а может и нет — это же дичара какая-то.
источник

ON

Oleg N in Svelte [svelt]
Dan Kozlov
Так нет же. Я так понимаю, что у тебя при любых раскладах все подписки родителей будут подписываться на все on:* в ребёнке.
типа того, и в реакте аналогично
источник

AP

Alexander Ponomarev in Svelte [svelt]
Dan Kozlov
Как можно задокументировать такую фигню?
CustomEvent<void> | Event<any>? Если у тебя любая подписка может улететь в любой элемент, который может зафайрить его, а может и нет — это же дичара какая-то.
ты пишешь ребёнка не делай дичь и все будет ок, либо читай документацию к ребёнку если не ты его писал и решай использовать его или нет. Точно также можно один пропс на тысячу внутренних элементов навесить и говорить что можно сделать дичь
источник

DK

Dan Kozlov in Svelte [svelt]
Но самый ключевой вопрос, парни, почему нельзя просто поднять наверх реф на элемент и в родителе уже предсказуемо с ним работать — вопрос для меня.
(хотя это и дичь, на мой взгляд)

Child.svelte
<script>
 export let ref;
</script>

<button bind:this='ref'>click</button>

Parent.svelte

<script>
 let ref: HTMLButtonElement | undefined;
 const events = ['click', 'longpressCustom'], cb = (e: Event) => console.log(e)
 $: if(ref) events.forEach(ev => ref.addEventListener(ev, cb))
</script>

<Child bind:ref />
источник

DK

Dan Kozlov in Svelte [svelt]
Alexander Ponomarev
ты пишешь ребёнка не делай дичь и все будет ок, либо читай документацию к ребёнку если не ты его писал и решай использовать его или нет. Точно также можно один пропс на тысячу внутренних элементов навесить и говорить что можно сделать дичь
Так форвард всего — это и есть дичь же. Опять же, у тебя любой ивент может быть как кастомным, так и от дома, и чтобы отделить одно от другого тебе надо знать всё про состав ребёнка.

В реакте ты передаёшь пропс, скажем, onClick: (e: EventHandler<MouseEvent, HTMLButtonElement>) => void, ну и его ни на что, кроме кнопки не навесишь, никакой ивент, кроме клика и прочих не передашь. С on:* у тебя реальная сигнатура — Event<HTMLElement> | CustomEvent. И как ты ни напишешь ребёнка, лучше не получится.
источник

DK

Dan Kozlov in Svelte [svelt]
Oleg N
типа того, и в реакте аналогично
Вроде нет, выше сообщение написал.
источник

AP

Alexander Ponomarev in Svelte [svelt]
Dan Kozlov
Так форвард всего — это и есть дичь же. Опять же, у тебя любой ивент может быть как кастомным, так и от дома, и чтобы отделить одно от другого тебе надо знать всё про состав ребёнка.

В реакте ты передаёшь пропс, скажем, onClick: (e: EventHandler<MouseEvent, HTMLButtonElement>) => void, ну и его ни на что, кроме кнопки не навесишь, никакой ивент, кроме клика и прочих не передашь. С on:* у тебя реальная сигнатура — Event<HTMLElement> | CustomEvent. И как ты ни напишешь ребёнка, лучше не получится.
я создаю хэндлеры на Element или HtmlElement потому что давать знания о внутренних элементах наверх это неправильно и это рефакторить проще
источник

ON

Oleg N in Svelte [svelt]
Dan Kozlov
Вроде нет, выше сообщение написал.
а чем разница?

svelte: <input on:* />, react: <input {...$props} />, что там что там просто присвоение переданых евентов
источник

DK

Dan Kozlov in Svelte [svelt]
Alexander Ponomarev
я создаю хэндлеры на Element или HtmlElement потому что давать знания о внутренних элементах наверх это неправильно и это рефакторить проще
Ну ладно, неважно, какой элемент. Важно, какое событие :)
источник

AP

Alexander Ponomarev in Svelte [svelt]
Dan Kozlov
Так форвард всего — это и есть дичь же. Опять же, у тебя любой ивент может быть как кастомным, так и от дома, и чтобы отделить одно от другого тебе надо знать всё про состав ребёнка.

В реакте ты передаёшь пропс, скажем, onClick: (e: EventHandler<MouseEvent, HTMLButtonElement>) => void, ну и его ни на что, кроме кнопки не навесишь, никакой ивент, кроме клика и прочих не передашь. С on:* у тебя реальная сигнатура — Event<HTMLElement> | CustomEvent. И как ты ни напишешь ребёнка, лучше не получится.
ты говоришь проблемы конкретной реализации через on:* и даже в этой реализации они решаемы
источник

DK

Dan Kozlov in Svelte [svelt]
Как?
источник

AP

Alexander Ponomarev in Svelte [svelt]
описанием интерфейса для компонента
источник

DK

Dan Kozlov in Svelte [svelt]
Если максимально широкое описание интерфейса компонента — это решение, то ок. Если у тебя каждый ивент может файриться кем угодно — тогда ок.
Мне просто такое бы не понравилось.
источник

AP

Alexander Ponomarev in Svelte [svelt]
ты же сверху перечислишь переданные эвенты, смотришь интерфейс если что-то не сходится падаешь
источник

AP

Alexander Ponomarev in Svelte [svelt]
well known интерфейсы можно конкретно типизировать до мелочей как они описаны в реакте
источник

DK

Dan Kozlov in Svelte [svelt]
Дом-элемент может выстрелить что угодно.
Выходит, тебе в каждом родителе надо предполагать, что каждый ивент может быть как от дома, так и не от дома. Как от нужно тебе элемента дома, так и от ненужного.
источник

AP

Alexander Ponomarev in Svelte [svelt]
Dan Kozlov
Дом-элемент может выстрелить что угодно.
Выходит, тебе в каждом родителе надо предполагать, что каждый ивент может быть как от дома, так и не от дома. Как от нужно тебе элемента дома, так и от ненужного.
ТС позволяет описать конкретные а все остальные фолбечить на EventListener
источник