Roman
в рабочем проекте сделал менюшку с огромной вложенностью но без close хендлера. Там попробовал бегать по менюшке через Children.map и мемоизировать В итоге вроде получилось норм
ох, я этим путем тоже ходил. очень бесит, когда вроде передаешь что-то, а оно потом видоизменяется через React.Children. очень неочевидно
Sergey
хотя конечно, можно делать const Menu1 = useMenu() но зачем?
Roman
хотя конечно, можно делать const Menu1 = useMenu() но зачем?
const { Menu, onClose } = useMenu() <Menu> <span onClick={onClose}>Item</span> </Menu>
Sergey
const { Menu, onClose } = useMenu() <Menu> <span onClick={onClose}>Item</span> </Menu>
const { Menu: UserMenu, onClose: onCloseUserMenu } = useMenu() const { Menu: CardMenu, onClose: onCloseCardMenu } = useMenu() <UserMenu> <span onClick={onCloseCardMenu}>Created cards by user</span> </UserMenu>
Sergey
видно ошибку?
Dmitriy
видно ошибку?
Да видно. Наверху юзать два одинаковых кастомный хука уже плдозрительно
Dmitriy
Это в 99% говорит об ошибке ниже
Dmitriy
Просто суть хука что это отдельная переиспользуимая логика *одного* компонента
Roman
const { Menu: UserMenu, onClose: onCloseUserMenu } = useMenu() const { Menu: CardMenu, onClose: onCloseCardMenu } = useMenu() <UserMenu> <span onClick={onCloseCardMenu}>Created cards by user</span> </UserMenu>
ты ж понимаешь, что такую или похожую ошибку можно в любом случае совершить. написать не ту переменную, использовать не ту функцию конечно есть случаи где ошибиться проще, но мое мнение, что это даже лучше. то есть сразу видно что надо разделять
Sergey
Просто суть хука что это отдельная переиспользуимая логика *одного* компонента
const state1 = React.useState(1) const state2 = React.useState(2) и такое допустимо
Sergey
Я про кастомный хук
для меня кастомные хуки это такие же хуки, как и реактовые. это переиспользуемая логика
Dmitriy
для меня кастомные хуки это такие же хуки, как и реактовые. это переиспользуемая логика
Смотри но на компоненты мы ж и вью бьём. Просто заметь. Там где в компоненте вью используется два одинаковых кастомный хука - это кандидат на разделение.
Sergey
ты ж понимаешь, что такую или похожую ошибку можно в любом случае совершить. написать не ту переменную, использовать не ту функцию конечно есть случаи где ошибиться проще, но мое мнение, что это даже лучше. то есть сразу видно что надо разделять
я обычно размышляю так, если возможно написать код так, чтобы он порождал меньше ошибок при использовании, лучше так и написать. В данном кейсе, если меню требует дополнительных переменных это не очень правильно. Как минимум нарушается инкапсуляция. Меню уже не контролирует самостотельно свое внутреннее состояние открыто/закрыто. То есть меню может быть закрыто в любой неизвестный момент, то есть даже мимо логики. И по факту, этот хендлер должен называть onItemClick, так как может не закрывать меню, а открывать вложенное, например. Поэтому сам по себе контроль таких состояний должен быть изнутри меню. Поэтому возможно, контекст это лучший выбор в данном случае
Vladislav
const { Menu: UserMenu, onClose: onCloseUserMenu } = useMenu() const { Menu: CardMenu, onClose: onCloseCardMenu } = useMenu() <UserMenu> <span onClick={onCloseCardMenu}>Created cards by user</span> </UserMenu>
Зачем в хуке useMenu возвращается комплект, если этот компонент генерируется динамически в хуке то он ломает реконсиляцию
Roman
я обычно размышляю так, если возможно написать код так, чтобы он порождал меньше ошибок при использовании, лучше так и написать. В данном кейсе, если меню требует дополнительных переменных это не очень правильно. Как минимум нарушается инкапсуляция. Меню уже не контролирует самостотельно свое внутреннее состояние открыто/закрыто. То есть меню может быть закрыто в любой неизвестный момент, то есть даже мимо логики. И по факту, этот хендлер должен называть onItemClick, так как может не закрывать меню, а открывать вложенное, например. Поэтому сам по себе контроль таких состояний должен быть изнутри меню. Поэтому возможно, контекст это лучший выбор в данном случае
тогда ты даёшь меню слишком много знаний. оно у тебя и за закрытие отвечает, и может за вложенность, компонент либо перестает быть абстрактным, либо становится дикой лапшой из ручек и ифов
Sergey
Смотри но на компоненты мы ж и вью бьём. Просто заметь. Там где в компоненте вью используется два одинаковых кастомный хука - это кандидат на разделение.
я не готов утверждать, что выражение "если есть два одинаковых кастомных хука в одном месте, код необходимо разделять на два компонента" истина в 100% случаев.
Dmitriy
я не готов утверждать, что выражение "если есть два одинаковых кастомных хука в одном месте, код необходимо разделять на два компонента" истина в 100% случаев.
Конечно не в 100, но это мое личное наблюдение и оно часто подтверждается. Чем более низкоуровневый хук, так сказать, тем меньше это правило работает.
Vladislav
а пруфы какие-нибудь есть про ломание реконсиляции??
Я не видел код хука, но если там действительно динамически генерируется компонент, то это то же самое что динамически генерировать его в рендере, об этом есть в официальной документации
Vladislav
а пруфы какие-нибудь есть про ломание реконсиляции??
А вообще это очень легко проверить, реконсиляция идёт по ссылкам, если ссылка меняется то все ломается
Sergey
тогда ты даёшь меню слишком много знаний. оно у тебя и за закрытие отвечает, и может за вложенность, компонент либо перестает быть абстрактным, либо становится дикой лапшой из ручек и ифов
То как он внутри устроен это совершенно другая область проектирования. И компонент Меню должен самостоятельно отвечать за собстенное устройство. Пользователи компонента ни в коем случае не должны знать как открывать вложенные менюшки, как закрывать меню. Как минимум потому, что тогда рефакторинг менюшки просто невозможен, ибо может быть множество пользователей, которые использовали его неизвестным для тебя способом. Один из вариантов решения это определить конечное количество возможностей использования компонента. И в данном случае внутренний контроль за всем что связано с меню выглядит как принцип единственной ответственности. То есть меню самостоятельно реализует и управляет своими элементами, способом их отображение, состоянием открытия/закрытия и субменю
Oleg
А чего удалили мое мнение о vue?
Sergey
А чего удалили мое мнение о vue?
потому что это чат по реакту. По vue есть отдельный чат. Не надо здесь оффтопить. Вон уже три сообщения появились вообще мимо темы чата
Oleg
Админ может вообще запретить тут обсуждать js
Ну я реально не понял прикола) было сравнение с реактом)
Roman
То как он внутри устроен это совершенно другая область проектирования. И компонент Меню должен самостоятельно отвечать за собстенное устройство. Пользователи компонента ни в коем случае не должны знать как открывать вложенные менюшки, как закрывать меню. Как минимум потому, что тогда рефакторинг менюшки просто невозможен, ибо может быть множество пользователей, которые использовали его неизвестным для тебя способом. Один из вариантов решения это определить конечное количество возможностей использования компонента. И в данном случае внутренний контроль за всем что связано с меню выглядит как принцип единственной ответственности. То есть меню самостоятельно реализует и управляет своими элементами, способом их отображение, состоянием открытия/закрытия и субменю
тогда получается негибко и потом когда появляется новый вариант Item, например асинхронный (то есть надо что-то сделать, а потом только закрыть меню), то твой компонент нельзя использовать и надо либо дописывать либо писать ещё один
Sergey
А какое правило я нарушил то? Где оффтоп в ключе со сравнением с реактом
Если хочешь породить флейм, пиши о вуе и жиквери. Никогда такие обсуждения не заканчивались правильными выводами, только в конце начинались обсирания личностей друг друга и выдачей ReadOnly. Нет смысла
Roman
Слишком гибко это тоже крайне плохо
согласен. сейчас сижу балансирую
Sergey
То есть сухие диалоги типа «ребят, почему это не работает» круче. Ок.
вот сейчас тред интересный, про рендер-пропы и прочее. Всё в контексте реакта. Обсуждать штуки которые мимо реакта вообще не имеет смысла никакого
Vladislav
мемоизация решает
Можно использовать мемоизацию но она предназначена немного не для этого, ведь время от времени реакт очищает память и в этот момент будет вылазить неожиданный баг с потерей состояния компонента и всего что внутри
Roman
Слишком гибко это тоже крайне плохо
у меня вообще замечательный кейс: около 25 разработчиков на проекте и каждый с разным уровнем знаний реакта и программирования вообще. плюс половина из них за океаном и надо сделать компоненты такими, чтоб все могли нормально пользоваться :) и чтоб задачи решали
Андрей
То есть сухие диалоги типа «ребят, почему это не работает» круче. Ок.
Я тебе скажу одно: если проекты популярные и на них базируются новые решения, то вопрос о их сравнении будет превращён в срач на 99%. Смысла в этом нет, поэтому лучше такое удалять.
Vladislav
Тот пример, что я расписал мне не нравится. Поэтому я предпочитаю <Menu импортировать, а не создавать в рантайме
Полностью согласен, однако вариант интересен с точки зрения dependency injection, можно для разных пользователей юзать разные компоненты, главное не генерировать их внутри хука
Andrew
у меня вообще замечательный кейс: около 25 разработчиков на проекте и каждый с разным уровнем знаний реакта и программирования вообще. плюс половина из них за океаном и надо сделать компоненты такими, чтоб все могли нормально пользоваться :) и чтоб задачи решали
Была прикольная статья из тинкоф банка вроде где они с каждой команды продуктовой выделили по человеку для создания библиотеки компонентов и постоянно просили их о ревью продуктового кода что бы компоненты правильно использовали
Sergey
согласен. сейчас сижу балансирую
вообще, хорошо, если менюшка будет работать с неким абстрактным Item, а также предоставлять некий набор готовых реализаций. Пользователь сможет реализовать интерфейс Item и сделать например тот же синхронный Item. Вот тогда компонентный подход будет работать на ура. Расширяемо, Предсказуемо, Гибко.
Sergey
у меня вообще замечательный кейс: около 25 разработчиков на проекте и каждый с разным уровнем знаний реакта и программирования вообще. плюс половина из них за океаном и надо сделать компоненты такими, чтоб все могли нормально пользоваться :) и чтоб задачи решали
У нас для этого создана роль Архитектор, который следит за всем кодом, который создается в проекте. Ревьювит, рефакторит, пишет внутренние статьи и порождает хорошие практики.
Roman
на другом проекте у нас так и есть. и у них все зашибись
Ruslan
всем привет, нужна помощь, как мне переделать обычный класс в реакт класс
Sergey
всем привет, нужна помощь, как мне переделать обычный класс в реакт класс
либо расписывай здесь сам класс, опиши его задачи, цели использования и прочую полезную информацию. либо приходи в лс, накидывай ₽₽ и давай разбираться в конкретном случае. Конкретно это сообщение не несет никакой полезной информации.
Oleg
@sovasergey глянул тред про рендер пропс. У вас есть открытый репо какого либо проекта для изучения исходного кода?
Oleg
Oruj
специалисты, чет пропсы сюда не садятся. в функцию withStateAllProducts
Пантелеев
специалисты, чет пропсы сюда не садятся. в функцию withStateAllProducts
А почему фигурные скобки при деструктуризации? Вроде же квадратные везде
Oruj
туда даже не доходит речь)
Sergey
А почему фигурные скобки при деструктуризации? Вроде же квадратные везде
есть деструктуризация массивов а есть объектов const [a, b] = [1, 2] const { a, b } = { a: 1, b: 2 }
Dmitry
Мне кажется потеря контекста
Dmitry
А дебажить не пробывал ?
Igor
посмотри что в this лежит
Oruj
А дебажить не пробывал ?
и в Wrapped кажется не адекватным
Igor
а тв собсно говоря и не передаешь Wrapped
Sergey
Привет народ, у кого-то есть опыт работы с монако ?
Igor
хотя хз, попробуй вынести из compose
Sergey
nometa.xyz
у меня нет четкого вопроса о проблеме, я просто ищу человека который работал, что-бы узнать впечатления. Так-как мне перефразировать свой вопрос - исходя из правил ?
Oruj
а тв собсно говоря и не передаешь Wrapped
да да там проблема в передаче. compose вроде должен передавать
Igor
да да там проблема в передаче. compose вроде должен передавать
видимо результат предыдущих функций такой, как у тебя, у тебя же есть что-то в Wrapped
Dmitry
да да там проблема в передаче. compose вроде должен передавать
Попробуй через конструктор вызвать super(props)