Chingiz
Chingiz
Eugene
в componenDidUpdate противопоказано использовать this.setState 🌚
Chingiz
в componenDidUpdate противопоказано использовать this.setState 🌚
хорошо, а как тогда вызвать мне метод и загнать данные в стейт?
Yuriy
Всем привет! Я иногда делаю свои pet проекты, в т.ч. с использованием ReactJS. Вот смотрю в сторону использования в связке TypeScript. Подскажите плиз как правильно сейчас "носить" React+TS, с точки зрения реализации компонентов? Функции или классы? Как я понимаю, с появлением хуков, рекомендуется использовать функции. Но концепция TS как ООП, ближе к классам. Поделитесь пожалуйста мнением?
Тагир
Привет, подскажите плз, я могу использовать переменную с именем type (именно в нижнем регистре) в качестве поля у компонента?
Sergey
я предпочитаю писать в стиле, который порождает меньше кода в количестве, но при этом не теряет в читаемости. для меня это функции+хуки, иногда ХОКи, классы и рендер-пропс
Yuriy
понял, как понятнее и удобнее. Спасибо всем за мнение.😃
Sergey
render-prop позволяет рендерить списки и меню красиво.
Dmitriy
Это в карточках? Виз и рендер проп)
Андрей
У меня в таких случаях в голове сидит то, что лучше уж компоненты кидать в таком случае, чем рендер-пропсы. Но это мои забавы.
Sergey
У меня в таких случаях в голове сидит то, что лучше уж компоненты кидать в таком случае, чем рендер-пропсы. Но это мои забавы.
я не фанат рендер-пропов, но прокидывать компонент хуже. Как минимум это не позволяет установить компоненту пропсы, как максимум, код разбивается на куски, которые приходится читать в разных местах
Sergey
это можно было сделать просто через передачу children В этом случае было бы уместно. <Authenticated>Show only when authenticated</Authenticated>
Sergey
Как минимум это не позволяет установить компоненту пропсы Вот тут не понял.
<Example component={Another} /> как установить свои пропсы компоненту Another? <Example render={() => <Another prop={1} />} />
Sergey
попытки смешать эти подходы порождают говнецо вроде react-router <Route component={} render={}>{() => <div />}</Route>
Sergey
50 пропс, которые невозможно использовать одновременно
Dmitriy
Нужно вникнуть, но как по мне увидел два кейса для кастомхукс. Это карточки?
Sergey
что за кейсы?
Igor
роуты не лучше перенести в отдельный файл роутов? А если нужно будет пушить в историю - по идее везде будут разбросаны уникальные строки
Андрей
<Example component={Another} /> как установить свои пропсы компоненту Another? <Example render={() => <Another prop={1} />} />
Я стараюсь придерживаться апи подобного вида если это уж очень сильно нужно: <Example component={Another} componentProps={props} /> Мне не нравится прокидывать функцию, так как она очень легко превращается в говно, которое зависит от почти от всего замыкания. А прокидывание компонента хотя бы немного позволяют заставлять человека думать.
Dmitriy
что за кейсы?
Виз аккаунт только логику содержит?
Sergey
код должен не заставлять думать, а понимать.
Sergey
если ты сидишь и полчаса думаешь над кодом, ну это точно стоит переписать
Андрей
Ок, понял тебя.
Sergey
роуты не лучше перенести в отдельный файл роутов? А если нужно будет пушить в историю - по идее везде будут разбросаны уникальные строки
очень давно размышляю на тему роутов и выносить в отдельный файл тоже проблема ибо придется создавать функции вроде ({ cardId }) => /open/${cardId} а значит придется дублировать и в роутах в идеале хочется из списка роутов получить список таких функций. const routing = createRouting(routes) routing.openCard(5) // /open/5
Sergey
Вообще, в карточках очень много разных экспериментов, много из которых неудачные и выглядят странно
Roman
зачем это нужно, если уже хуки пишешь? вместо вызова props.render* можно просто возвращать exists, empty
Dmitriy
Хм куда fetching делося
Igor
очень давно размышляю на тему роутов и выносить в отдельный файл тоже проблема ибо придется создавать функции вроде ({ cardId }) => /open/${cardId} а значит придется дублировать и в роутах в идеале хочется из списка роутов получить список таких функций. const routing = createRouting(routes) routing.openCard(5) // /open/5
посмотри es6-template-string в нпм, иными словами ты вызываешь метод template и передаешь определенную структуру, а в роутах просто у тебя строка, но в виде шаблонной строки и в остальном работает как шаблонная строка, например () => template(routes.user, variable, {key: ‘id’}) -> будет роут со значением из variable по ключу id сама строка ‘/@${id}’
Sergey
<Access can="admin.card.delete"> <Button>Delete</Button> </Access> по мне выглядит лучше, чем: const canDelete = withAccess("admin.card.delete") return ( //... { canDelete ? ( <Button>Delete</Button> ) : ( <span>Another</span> ) } //... ) тупо потому, что таких операторов может быть много и при чтении jsx приходится прыгать к определению переменных вроде canDelete
Sergey
ну и чисто визуально это выглядит проще
Igor
тоже пользуюсь такой же практикой, вместо 100500 тернарников
Sergey
Хм куда fetching делося
баги, друг мой.
Dmitriy
баги, друг мой.
Ааа. А то думал не проснулся. Мы ж за рендер проп заговорили, вот я и пытался всмотреться зачем тут именно этот паттерн нужен.
Igor
возможно имеет смысл сделать что-то похожее, но самостоятельно. я хочу из роутов получать список типизированных функций, а не описывать всё самостотяельно, но пока не придумал годного способа
а никак не опишешь, тебе в любом случае если будет одна и та же структура использоваться для формирования роута то в некоторых местах эту структуру нужно подгонять руками, и только потом уже вызывать метод
Dmitriy
именно в Authenticated он не нужен
Так его нету в визаккаунт.
Sergey
Так его нету в визаккаунт.
я имею ввиду renderProp паттерн, не нужен он в authenticated
Sergey
вообще, как найду дизайнера, сяду переделывать все компоненты
Igor
можно как-то reach-router синхронизировать со стором редакса?
Dmitriy
А тут чисто что б хендлер пробросить?
Sergey
А тут чисто что б хендлер пробросить?
1. да, чтобы close можно было выполнить без хуков 2. функция рендерится только когда меню отображается
Sergey
@dreyks ты об этом?
Roman
хах у меня практически такой же код написан :)
Sergey
да
там опциональные пропсы же
Roman
там опциональные пропсы же
ну ты ведь в контрпримере юзаешь две ветки, а в своем варианте только одну
Sergey
А почему заюзать хук тут было бы хуже?
1. если у меня 4-5 меню на компонент 2. а если меню вложенные?
Sergey
ну ты ведь в контрпримере юзаешь две ветки, а в своем варианте только одну
это да. радует, что заметил))) В этом случае, нужен будет второй <Access который будет иметь отрицание. Что в общем-то не сильно лучше тернарника
Sergey
И поэтому тут я ещё не нашел хорошего решения. Тернарники мне не нравятся, потому что выглядят страшно в jsx. А <Access не имеет хороших else мне предлагали <Access> <Then></Then> <Else></Else> </Access> но это совсем дно, ИМХО
Roman
это да. радует, что заметил))) В этом случае, нужен будет второй <Access который будет иметь отрицание. Что в общем-то не сильно лучше тернарника
так я ж о чем. я сам блин бьюсь над тем, как бы красиво и просто все делать просто с хуками получается подход через переменные, а с рендерпропами все рисуется одним деревом, но функции эти меня чет подбешивают уже
Андрей
А когда ты прокидываешь пропсы в componentProps они не зависят от замыкания?
Они уже в замыкании. Но лучше не заморачиваться с этой концепциеей. Она очень кривая и я стараюсь сделать как-нибудь по-другому всегда.
Dmitriy
1. если у меня 4-5 меню на компонент 2. а если меню вложенные?
В таком случае я бы наверное заюзал контекст и не запаривался настолько с композицией, все равно ею все кейсы не покроешь.
Roman
я покачто смрился с тернарниками, там посмоторим что можно придумать
Roman
В таком случае я бы наверное заюзал контекст и не запаривался настолько с композицией, все равно ею все кейсы не покроешь.
покроешь, только потом сам же запутаешься в миллионе компонентов :) в любом деле главное не упарываться
Sergey
В таком случае я бы наверное заюзал контекст и не запаривался настолько с композицией, все равно ею все кейсы не покроешь.
в рабочем проекте сделал менюшку с огромной вложенностью но без close хендлера. Там попробовал бегать по менюшке через Children.map и мемоизировать В итоге вроде получилось норм
Sergey
В таком случае я бы наверное заюзал контекст и не запаривался настолько с композицией, все равно ею все кейсы не покроешь.
в любом случае, хочется жить без явных хендлеров на уровне родительского компонента либо render-prop, либо контекст, либо Children.map переменные на уровне компонента (через хуки) порождают поле для ошибок