Size: a a a

2020 April 13

T

Th0r in Svelte [svelt]
Denys Novakov
Скажите, если у меня много одинаковых компонентов в Svelte, и я не хочу, чтобы в каждом из них создавался обработчик на клик, достаточно пробросить событие с помощью on:click в родительский элемент? Вот на примере:

{#each numbers as number}
   <Tile {number} on:click={clickHandler} on:keydown={keyDownHandler}/>
{/each}

Раньше обработчики были внутри компонента Tile, теперь я их перенёс в родительский, но меня смущает что они за #each. Они не создадутся снова для каждого компонента Tile? Может их надо переносить еще выше?
нет, когда ты присваиваешь хендлеру функцию - передается ссылка на функцию, а когда присваиваешь () => func(index), то создается эта функция со своим замыканием
источник

D

Dr Zlo in Svelte [svelt]
И будут понятны другому знающему паттерны
источник

ИК

Игорь Корнелли in Svelte [svelt]
Dr Zlo
А потом два дня сидиш, придумываеш компонент для хранения настроек по всему приложению, доступный в каждом месте
При чем тут паттерн и непонимание того, что делаешь?
источник

D

Dr Zlo in Svelte [svelt]
Про два дня я утрирую, суть в том что зачем тратить время придумывая своё, если можно ознакомится с готовыми методологиями проектирования, и применять их если нужно?
источник

ИК

Игорь Корнелли in Svelte [svelt]
Dr Zlo
Хотя мог бы взять просто синглтон
Мы про js?) если да, то импорт конфига чем не подходит? Зачем перегружать простой объект каким то неведомым паттерном? В чем профит и как человек знающий паттерны поймёт, какой паттерн тут использован? Все разработчики - паттерн-сомелье?)
источник

DN

Denys Novakov in Svelte [svelt]
Th0r
нет, когда ты присваиваешь хендлеру функцию - передается ссылка на функцию, а когда присваиваешь () => func(index), то создается эта функция со своим замыканием
Я ошибся. Имелись в виду слушатели, то есть EventListenerы. Хотелось бы чтобы было только два. Один для кликов, другой для нажатий кнопок.
источник

ИК

Игорь Корнелли in Svelte [svelt]
Dr Zlo
Про два дня я утрирую, суть в том что зачем тратить время придумывая своё, если можно ознакомится с готовыми методологиями проектирования, и применять их если нужно?
Разговор ни о чем, в целом) ну паттерны и паттерны, ну знают и знают) ну напишу я свой файл с конфигом, я же разработчик, что я руки испачкаю, если без паттерна экспортирую объект с настройками?) кому вообще важно класс я напишу от объекта или просто объект передам, один черт интерпретироваться он будет как объект, турбофану сахар все равно перелопачивать в низкоуровневые стеки из объектов все.
источник

D

Dr Zlo in Svelte [svelt]
Игорь Корнелли
Мы про js?) если да, то импорт конфига чем не подходит? Зачем перегружать простой объект каким то неведомым паттерном? В чем профит и как человек знающий паттерны поймёт, какой паттерн тут использован? Все разработчики - паттерн-сомелье?)
Да например тот же конфиг, мы с ним работаем в двух файлах, импортировали, создали, получили два разных обьекта. Теперь если в коде одного файла мы его поменяли - код второго не знает о изменениях, он оперирует другим обьектом.
источник

D

Dr Zlo in Svelte [svelt]
Это классическая, частая проблема, как иметь один и тот же инстанс везде, желательно чтобы это было автоматически.
источник

D

Dr Zlo in Svelte [svelt]
Чтобы код не давал даже сделать два экземпляра.
источник

ИК

Игорь Корнелли in Svelte [svelt]
Dr Zlo
Чтобы код не давал даже сделать два экземпляра.
И каким же образом можно так сделать, чтобы при импорте файла нельзя было бы создать ещё экземпляр? Кажется, нет способа однозначно запретить сделать клон объекта, тут даже паттерн бессилен)
источник

DN

Denys Novakov in Svelte [svelt]
Th0r
нет, когда ты присваиваешь хендлеру функцию - передается ссылка на функцию, а когда присваиваешь () => func(index), то создается эта функция со своим замыканием
Я попробовал так:

{#each numbers as number}
   <Tile {number} on:click={()=>console.log(number)} on:keydown={keyDownHandler}/>
{/each}

и кажется всё таки eventListent создаётся для каждого компонента. Не понятно только как работает сам принцип проброса событий от потомков к родителю. Это что-то типа всплытия или основано на событиях. Может нет смысла переносить всё выше, чтобы был только один обработчик для кликов.
источник

T

Th0r in Svelte [svelt]
Denys Novakov
Я попробовал так:

{#each numbers as number}
   <Tile {number} on:click={()=>console.log(number)} on:keydown={keyDownHandler}/>
{/each}

и кажется всё таки eventListent создаётся для каждого компонента. Не понятно только как работает сам принцип проброса событий от потомков к родителю. Это что-то типа всплытия или основано на событиях. Может нет смысла переносить всё выше, чтобы был только один обработчик для кликов.
https://svelte.dev/repl/41096c004e4e4d4d90685c1e2d103e59?version=3
открой вкладку JS output и посмотри
click_handler создается в функции create_each_block и присваивается из скоупа,
а функция keyDownHandler - одна на весь модуль
источник

DN

Denys Novakov in Svelte [svelt]
Th0r
https://svelte.dev/repl/41096c004e4e4d4d90685c1e2d103e59?version=3
открой вкладку JS output и посмотри
click_handler создается в функции create_each_block и присваивается из скоупа,
а функция keyDownHandler - одна на весь модуль
С функциями понятно, но вопрос был в другом, в EventListener-ах.
источник

D

Dr Zlo in Svelte [svelt]
Игорь Корнелли
И каким же образом можно так сделать, чтобы при импорте файла нельзя было бы создать ещё экземпляр? Кажется, нет способа однозначно запретить сделать клон объекта, тут даже паттерн бессилен)
let Singleton = new function(){
   let instance = this;
   return function(){ return instance }
};

export default Singleton;
источник

D

Dr Zlo in Svelte [svelt]
легко, собственно
источник

D

Dr Zlo in Svelte [svelt]
В одном файле я делаю:

import Singleton from "./test.js";

let test = new Singleton;

setInterval(function () {
 console.log(test);
}, 1000);
источник

D

Dr Zlo in Svelte [svelt]
Во втором:
import Singleton from "./test.js";

let test = new Singleton;
setTimeout(function () {
   test.a = 123;
}, 2000);
источник

T

Th0r in Svelte [svelt]
Dr Zlo
let Singleton = new function(){
   let instance = this;
   return function(){ return instance }
};

export default Singleton;
просто импорт объекта - уже синглтон
источник

ИК

Игорь Корнелли in Svelte [svelt]
Dr Zlo
легко, собственно
Сеттинги через замыкание?
источник